Click here to Skip to main content
15,886,664 members
Articles / Programming Languages / C#

Enumeration Types do not Enumerate! Working around .NET and Language Limitations

Rate me:
Please Sign up or sign in to vote.
4.95/5 (74 votes)
10 Mar 2017CPOL31 min read 248K   641   111  
Generic classes for enumeration-based iteration and array indexing
/*
    Enumeration Performance Meter:
    Generic class Enumeration provides iteration capabilities based on enumeration or any other type with static fields;
    Generic class EnumerationIndexedArray implements enumeration-indexed arrays
    
    Copyright (C) 2008-2010 by Sergey A Kryukov
    http://www.SAKryukov.org
*/

using System;

namespace PerformanceMeter {
    using EnumerationItem = SA.Universal.Enumerations.EnumerationItem<TestEnumeration>;
    using Enumeration = SA.Universal.Enumerations.Enumeration<TestEnumeration>;
    using ArrayOfDouble = SA.Universal.Enumerations.EnumerationIndexedArray<TestEnumeration, double>;
    using Duration = System.Double;
    
    class Program {

        const int EnumerationCount = 1024;
        const int CycleCount = 1024;
        const string FmtEnumerationMember = "        en{0},";
        const double Nano = 1E+9;

        delegate void TimeAction();
        static void TimeIt(TimeAction initializationAction, TimeAction bodyAction) {
            DateTime start = DateTime.Now;
            initializationAction();
            DateTime initialization = DateTime.Now;
            bodyAction();
            DateTime finish = DateTime.Now;
            TimeSpan initializationSpan = initialization - start;
            TimeSpan iterationSpan = finish - initialization;
            TimeSpan totalSpan = finish - start;
            Duration initializationTime = initializationSpan.TotalSeconds;
            Duration iterationTime = iterationSpan.TotalSeconds;
            Duration totalTime = totalSpan.TotalSeconds;
            Duration accuracy = (initializationTime + iterationTime - totalTime) / totalTime;
            Duration reflectionIteration = initializationTime / EnumerationCount;
            Duration iteration = iterationTime / (EnumerationCount * CycleCount);
            reflectionIteration *= Nano;
            iteration *= Nano;
            WriteLine(
                "initialization: {0} ns; iteration: {1} ns ({2} times)",
                FormatDuration(reflectionIteration),
                FormatDuration(iteration),
                FormatDuration(reflectionIteration / iteration));
        } //TimeIt

        static void GenerateTestEnumDeclaration() {
            for (int index = 1; index <= EnumerationCount; index++)
                WriteLine(FmtEnumerationMember, index);
        } //GenerateTestEnumDeclaration

        static void TimeIterations() {
            Enumeration test = null;
            TimeIt(
                delegate() {
                    test = new Enumeration();
                },
                delegate() {
                    for (int cycle = 1; cycle <= CycleCount; cycle++)
                        foreach (EnumerationItem item in test)
                            Sink = item;
                });
        } //TimeIterations

        static void TimeArray() {
            Enumeration test = null;
            ArrayOfDouble dbl = null; 
            TimeIt(
                delegate() {
                    test = new Enumeration();
                    dbl = new ArrayOfDouble();
                },
                delegate() {
                    for (int cycle = 1; cycle <= CycleCount; cycle++)
                        foreach (EnumerationItem item in test)
                            dbl[item.EnumValue] = 0d;
                });
        } //TimeArray

        static void Measure() {
            WriteLine("Enumeration:");
            TimeIterations();
            WriteLine("\n\rArray:");
            TimeArray();
        } //Measure

        static string FormatDuration(double value) {
            return value.ToString("g3");
        } //FormatDuration

        static void Main(string[] args) {
            //GenerateTestEnumDeclaration();
            Measure();
        } //Main

        static EnumerationItem Sink = null;

        static void WriteLine(string line) { Console.WriteLine(line); }
        static void WriteLine(string format, params object[] parameters) { Console.WriteLine(format, parameters); }

    } //class Program

} //namespace PerformanceMeter 

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
United States United States
Physics, physical and quantum optics, mathematics, computer science, control systems for manufacturing, diagnostics, testing, and research, theory of music, musical instruments… Contact me: https://www.SAKryukov.org

Comments and Discussions