using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace EnumTest
{
public class Program
{
enum E
{
V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32,
V33, V34, V35, V36, V37, V38, V39, V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V50, V51, V52, V53, V54, V55, V56, V57, V58, V59, V60, V61, V62,
V63, V64, V65, V66, V67, V68, V69, V70, V71, V72, V73, V74, V75, V76, V77, V78, V79, V80, V81, V82, V83, V84, V85, V86, V87, V88, V89, V90, V91, V92,
V93, V94, V95, V96, V97, V98, V99, V100, V101, V102, V103, V104, V105, V106, V107, V108, V109, V110, V111, V112, V113, V114, V115, V116, V117, V118,
V119, V120, V121, V122, V123, V124, V125, V126, V127, V128, V129, V130, V131, V132, V133, V134, V135, V136, V137, V138, V139, V140, V141, V142, V143,
V144, V145, V146, V147, V148, V149, V150, V151, V152, V153, V154, V155, V156, V157, V158, V159, V160, V161, V162, V163, V164, V165, V166, V167, V168,
V169, V170, V171, V172, V173, V174, V175, V176, V177, V178, V179, V180, V181, V182, V183, V184, V185, V186, V187, V188, V189, V190, V191, V192, V193,
V194, V195, V196, V197, V198, V199, V200, V201, V202, V203, V204, V205, V206, V207, V208, V209, V210, V211, V212, V213, V214, V215, V216, V217, V218,
V219, V220, V221, V222, V223, V224, V225, V226, V227, V228, V229, V230, V231, V232, V233, V234, V235, V236, V237, V238, V239, V240, V241, V242, V243,
V244, V245, V246, V247, V248, V249, V250, V251, V252, V253, V254, V255, V256, V257, V258, V259, V260, V261, V262, V263, V264, V265, V266, V267, V268,
V269, V270, V271, V272, V273, V274, V275, V276, V277, V278, V279, V280, V281, V282, V283, V284, V285, V286, V287, V288, V289, V290, V291, V292, V293,
V294, V295, V296, V297, V298, V299, V300, V301, V302, V303, V304, V305, V306, V307, V308, V309, V310, V311, V312, V313, V314, V315, V316, V317, V318,
V319, V320, V321, V322, V323, V324, V325, V326, V327, V328, V329, V330, V331, V332, V333, V334, V335, V336, V337, V338, V339, V340, V341, V342, V343,
V344, V345, V346, V347, V348, V349, V350, V351, V352, V353, V354, V355, V356, V357, V358, V359, V360, V361, V362, V363, V364, V365, V366, V367, V368,
V369, V370, V371, V372, V373, V374, V375, V376, V377, V378, V379, V380, V381, V382, V383, V384, V385, V386, V387, V388, V389, V390, V391, V392, V393,
V394, V395, V396, V397, V398, V399, V400, V401, V402, V403, V404, V405, V406, V407, V408, V409, V410, V411, V412, V413, V414, V415, V416, V417, V418,
V419, V420, V421, V422, V423, V424, V425, V426, V427, V428, V429, V430, V431, V432, V433, V434, V435, V436, V437, V438, V439, V440, V441, V442, V443,
V444, V445, V446, V447, V448, V449, V450, V451, V452, V453, V454, V455, V456, V457, V458, V459, V460, V461, V462, V463, V464, V465, V466, V467, V468,
V469, V470, V471, V472, V473, V474, V475, V476, V477, V478, V479, V480, V481, V482, V483, V484, V485, V486, V487, V488, V489, V490, V491, V492, V493,
V494, V495, V496, V497, V498, V499, V500
}
static void Main(string[] args)
{
const int IterationCount = 1000;
Warmup(IterationCount);
Action noCastCall = () => TestNoCast();
Action castCall = () => TestCast();
Stopwatch sw = new Stopwatch();
var noCast = Enumerable
.Range(0, IterationCount)
.Select(i => Measure(sw, noCastCall))
.ToArray();
var cast = Enumerable
.Range(0, IterationCount)
.Select(i => Measure(sw, castCall))
.ToArray();
var noCastAvg = Average(noCast);
var castAvg = Average(cast);
var noCastStdDev = StandardDeviation(noCastAvg, noCast);
var castStdDev = StandardDeviation(castAvg, cast);
Console.WriteLine("No cast:" + noCastAvg + " +- " + noCastStdDev + "ms");
Console.WriteLine("Cast:" + castAvg + " +- " + castStdDev + "ms");
}
static void Warmup(int iterationCount)
{
foreach (var x in Enumerable.Range(0, iterationCount))
{
TestNoCast();
TestCast();
TestCast();
TestNoCast();
}
}
static double Average(long[] values)
{
return 1.0 * values.Sum() / values.Length;
}
static double StandardDeviation(double average, long[] values)
{
return Math.Sqrt(values.Select(x => (x - average) * (x - average)).Sum() / values.Length);
}
static long Measure(Stopwatch sw, Action a)
{
sw.Reset();
sw.Start();
a();
sw.Stop();
return sw.ElapsedMilliseconds;
}
static void TestNoCast()
{
foreach (E e in Enum.GetValues(typeof(E)))
{
DummyFunction(e);
}
}
static void TestCast()
{
foreach (var e in (E[])Enum.GetValues(typeof(E)))
{
DummyFunction(e);
}
}
static int dummy = 0;
static void DummyFunction(E e)
{
if (e.ToString().Contains('1'))
{
++dummy;
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwp1c2luZyBTeXN0ZW0uTGlucTsKIApuYW1lc3BhY2UgRW51bVRlc3QKewpwdWJsaWMgY2xhc3MgUHJvZ3JhbQp7CmVudW0gRQp7ClYxLCBWMiwgVjMsIFY0LCBWNSwgVjYsIFY3LCBWOCwgVjksIFYxMCwgVjExLCBWMTIsIFYxMywgVjE0LCBWMTUsIFYxNiwgVjE3LCBWMTgsIFYxOSwgVjIwLCBWMjEsIFYyMiwgVjIzLCBWMjQsIFYyNSwgVjI2LCBWMjcsIFYyOCwgVjI5LCBWMzAsIFYzMSwgVjMyLApWMzMsIFYzNCwgVjM1LCBWMzYsIFYzNywgVjM4LCBWMzksIFY0MCwgVjQxLCBWNDIsIFY0MywgVjQ0LCBWNDUsIFY0NiwgVjQ3LCBWNDgsIFY0OSwgVjUwLCBWNTEsIFY1MiwgVjUzLCBWNTQsIFY1NSwgVjU2LCBWNTcsIFY1OCwgVjU5LCBWNjAsIFY2MSwgVjYyLApWNjMsIFY2NCwgVjY1LCBWNjYsIFY2NywgVjY4LCBWNjksIFY3MCwgVjcxLCBWNzIsIFY3MywgVjc0LCBWNzUsIFY3NiwgVjc3LCBWNzgsIFY3OSwgVjgwLCBWODEsIFY4MiwgVjgzLCBWODQsIFY4NSwgVjg2LCBWODcsIFY4OCwgVjg5LCBWOTAsIFY5MSwgVjkyLApWOTMsIFY5NCwgVjk1LCBWOTYsIFY5NywgVjk4LCBWOTksIFYxMDAsIFYxMDEsIFYxMDIsIFYxMDMsIFYxMDQsIFYxMDUsIFYxMDYsIFYxMDcsIFYxMDgsIFYxMDksIFYxMTAsIFYxMTEsIFYxMTIsIFYxMTMsIFYxMTQsIFYxMTUsIFYxMTYsIFYxMTcsIFYxMTgsClYxMTksIFYxMjAsIFYxMjEsIFYxMjIsIFYxMjMsIFYxMjQsIFYxMjUsIFYxMjYsIFYxMjcsIFYxMjgsIFYxMjksIFYxMzAsIFYxMzEsIFYxMzIsIFYxMzMsIFYxMzQsIFYxMzUsIFYxMzYsIFYxMzcsIFYxMzgsIFYxMzksIFYxNDAsIFYxNDEsIFYxNDIsIFYxNDMsClYxNDQsIFYxNDUsIFYxNDYsIFYxNDcsIFYxNDgsIFYxNDksIFYxNTAsIFYxNTEsIFYxNTIsIFYxNTMsIFYxNTQsIFYxNTUsIFYxNTYsIFYxNTcsIFYxNTgsIFYxNTksIFYxNjAsIFYxNjEsIFYxNjIsIFYxNjMsIFYxNjQsIFYxNjUsIFYxNjYsIFYxNjcsIFYxNjgsClYxNjksIFYxNzAsIFYxNzEsIFYxNzIsIFYxNzMsIFYxNzQsIFYxNzUsIFYxNzYsIFYxNzcsIFYxNzgsIFYxNzksIFYxODAsIFYxODEsIFYxODIsIFYxODMsIFYxODQsIFYxODUsIFYxODYsIFYxODcsIFYxODgsIFYxODksIFYxOTAsIFYxOTEsIFYxOTIsIFYxOTMsClYxOTQsIFYxOTUsIFYxOTYsIFYxOTcsIFYxOTgsIFYxOTksIFYyMDAsIFYyMDEsIFYyMDIsIFYyMDMsIFYyMDQsIFYyMDUsIFYyMDYsIFYyMDcsIFYyMDgsIFYyMDksIFYyMTAsIFYyMTEsIFYyMTIsIFYyMTMsIFYyMTQsIFYyMTUsIFYyMTYsIFYyMTcsIFYyMTgsClYyMTksIFYyMjAsIFYyMjEsIFYyMjIsIFYyMjMsIFYyMjQsIFYyMjUsIFYyMjYsIFYyMjcsIFYyMjgsIFYyMjksIFYyMzAsIFYyMzEsIFYyMzIsIFYyMzMsIFYyMzQsIFYyMzUsIFYyMzYsIFYyMzcsIFYyMzgsIFYyMzksIFYyNDAsIFYyNDEsIFYyNDIsIFYyNDMsClYyNDQsIFYyNDUsIFYyNDYsIFYyNDcsIFYyNDgsIFYyNDksIFYyNTAsIFYyNTEsIFYyNTIsIFYyNTMsIFYyNTQsIFYyNTUsIFYyNTYsIFYyNTcsIFYyNTgsIFYyNTksIFYyNjAsIFYyNjEsIFYyNjIsIFYyNjMsIFYyNjQsIFYyNjUsIFYyNjYsIFYyNjcsIFYyNjgsClYyNjksIFYyNzAsIFYyNzEsIFYyNzIsIFYyNzMsIFYyNzQsIFYyNzUsIFYyNzYsIFYyNzcsIFYyNzgsIFYyNzksIFYyODAsIFYyODEsIFYyODIsIFYyODMsIFYyODQsIFYyODUsIFYyODYsIFYyODcsIFYyODgsIFYyODksIFYyOTAsIFYyOTEsIFYyOTIsIFYyOTMsClYyOTQsIFYyOTUsIFYyOTYsIFYyOTcsIFYyOTgsIFYyOTksIFYzMDAsIFYzMDEsIFYzMDIsIFYzMDMsIFYzMDQsIFYzMDUsIFYzMDYsIFYzMDcsIFYzMDgsIFYzMDksIFYzMTAsIFYzMTEsIFYzMTIsIFYzMTMsIFYzMTQsIFYzMTUsIFYzMTYsIFYzMTcsIFYzMTgsClYzMTksIFYzMjAsIFYzMjEsIFYzMjIsIFYzMjMsIFYzMjQsIFYzMjUsIFYzMjYsIFYzMjcsIFYzMjgsIFYzMjksIFYzMzAsIFYzMzEsIFYzMzIsIFYzMzMsIFYzMzQsIFYzMzUsIFYzMzYsIFYzMzcsIFYzMzgsIFYzMzksIFYzNDAsIFYzNDEsIFYzNDIsIFYzNDMsClYzNDQsIFYzNDUsIFYzNDYsIFYzNDcsIFYzNDgsIFYzNDksIFYzNTAsIFYzNTEsIFYzNTIsIFYzNTMsIFYzNTQsIFYzNTUsIFYzNTYsIFYzNTcsIFYzNTgsIFYzNTksIFYzNjAsIFYzNjEsIFYzNjIsIFYzNjMsIFYzNjQsIFYzNjUsIFYzNjYsIFYzNjcsIFYzNjgsClYzNjksIFYzNzAsIFYzNzEsIFYzNzIsIFYzNzMsIFYzNzQsIFYzNzUsIFYzNzYsIFYzNzcsIFYzNzgsIFYzNzksIFYzODAsIFYzODEsIFYzODIsIFYzODMsIFYzODQsIFYzODUsIFYzODYsIFYzODcsIFYzODgsIFYzODksIFYzOTAsIFYzOTEsIFYzOTIsIFYzOTMsClYzOTQsIFYzOTUsIFYzOTYsIFYzOTcsIFYzOTgsIFYzOTksIFY0MDAsIFY0MDEsIFY0MDIsIFY0MDMsIFY0MDQsIFY0MDUsIFY0MDYsIFY0MDcsIFY0MDgsIFY0MDksIFY0MTAsIFY0MTEsIFY0MTIsIFY0MTMsIFY0MTQsIFY0MTUsIFY0MTYsIFY0MTcsIFY0MTgsClY0MTksIFY0MjAsIFY0MjEsIFY0MjIsIFY0MjMsIFY0MjQsIFY0MjUsIFY0MjYsIFY0MjcsIFY0MjgsIFY0MjksIFY0MzAsIFY0MzEsIFY0MzIsIFY0MzMsIFY0MzQsIFY0MzUsIFY0MzYsIFY0MzcsIFY0MzgsIFY0MzksIFY0NDAsIFY0NDEsIFY0NDIsIFY0NDMsClY0NDQsIFY0NDUsIFY0NDYsIFY0NDcsIFY0NDgsIFY0NDksIFY0NTAsIFY0NTEsIFY0NTIsIFY0NTMsIFY0NTQsIFY0NTUsIFY0NTYsIFY0NTcsIFY0NTgsIFY0NTksIFY0NjAsIFY0NjEsIFY0NjIsIFY0NjMsIFY0NjQsIFY0NjUsIFY0NjYsIFY0NjcsIFY0NjgsClY0NjksIFY0NzAsIFY0NzEsIFY0NzIsIFY0NzMsIFY0NzQsIFY0NzUsIFY0NzYsIFY0NzcsIFY0NzgsIFY0NzksIFY0ODAsIFY0ODEsIFY0ODIsIFY0ODMsIFY0ODQsIFY0ODUsIFY0ODYsIFY0ODcsIFY0ODgsIFY0ODksIFY0OTAsIFY0OTEsIFY0OTIsIFY0OTMsClY0OTQsIFY0OTUsIFY0OTYsIFY0OTcsIFY0OTgsIFY0OTksIFY1MDAKfQogCnN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKewpjb25zdCBpbnQgSXRlcmF0aW9uQ291bnQgPSAxMDAwOwogCldhcm11cChJdGVyYXRpb25Db3VudCk7CiAKQWN0aW9uIG5vQ2FzdENhbGwgPSAoKSA9PiBUZXN0Tm9DYXN0KCk7CkFjdGlvbiBjYXN0Q2FsbCA9ICgpID0+IFRlc3RDYXN0KCk7CiAKU3RvcHdhdGNoIHN3ID0gbmV3IFN0b3B3YXRjaCgpOwogCnZhciBub0Nhc3QgPSBFbnVtZXJhYmxlCi5SYW5nZSgwLCBJdGVyYXRpb25Db3VudCkKLlNlbGVjdChpID0+IE1lYXN1cmUoc3csIG5vQ2FzdENhbGwpKQouVG9BcnJheSgpOwogCnZhciBjYXN0ID0gRW51bWVyYWJsZQouUmFuZ2UoMCwgSXRlcmF0aW9uQ291bnQpCi5TZWxlY3QoaSA9PiBNZWFzdXJlKHN3LCBjYXN0Q2FsbCkpCi5Ub0FycmF5KCk7CiAKdmFyIG5vQ2FzdEF2ZyA9IEF2ZXJhZ2Uobm9DYXN0KTsKdmFyIGNhc3RBdmcgPSBBdmVyYWdlKGNhc3QpOwp2YXIgbm9DYXN0U3RkRGV2ID0gU3RhbmRhcmREZXZpYXRpb24obm9DYXN0QXZnLCBub0Nhc3QpOwp2YXIgY2FzdFN0ZERldiA9IFN0YW5kYXJkRGV2aWF0aW9uKGNhc3RBdmcsIGNhc3QpOwogCkNvbnNvbGUuV3JpdGVMaW5lKCJObyBjYXN0OiIgKyBub0Nhc3RBdmcgKyAiICstICIgKyBub0Nhc3RTdGREZXYgKyAibXMiKTsKQ29uc29sZS5Xcml0ZUxpbmUoIkNhc3Q6IiArIGNhc3RBdmcgKyAiICstICIgKyBjYXN0U3RkRGV2ICsgIm1zIik7Cgp9CiAKc3RhdGljIHZvaWQgV2FybXVwKGludCBpdGVyYXRpb25Db3VudCkKewpmb3JlYWNoICh2YXIgeCBpbiBFbnVtZXJhYmxlLlJhbmdlKDAsIGl0ZXJhdGlvbkNvdW50KSkKewpUZXN0Tm9DYXN0KCk7ClRlc3RDYXN0KCk7ClRlc3RDYXN0KCk7ClRlc3ROb0Nhc3QoKTsKfQp9CiAKc3RhdGljIGRvdWJsZSBBdmVyYWdlKGxvbmdbXSB2YWx1ZXMpCnsKcmV0dXJuIDEuMCAqIHZhbHVlcy5TdW0oKSAvIHZhbHVlcy5MZW5ndGg7Cn0KIApzdGF0aWMgZG91YmxlIFN0YW5kYXJkRGV2aWF0aW9uKGRvdWJsZSBhdmVyYWdlLCBsb25nW10gdmFsdWVzKQp7CnJldHVybiBNYXRoLlNxcnQodmFsdWVzLlNlbGVjdCh4ID0+ICh4IC0gYXZlcmFnZSkgKiAoeCAtIGF2ZXJhZ2UpKS5TdW0oKSAvIHZhbHVlcy5MZW5ndGgpOwp9CiAKc3RhdGljIGxvbmcgTWVhc3VyZShTdG9wd2F0Y2ggc3csIEFjdGlvbiBhKQp7CnN3LlJlc2V0KCk7CnN3LlN0YXJ0KCk7CmEoKTsKc3cuU3RvcCgpOwpyZXR1cm4gc3cuRWxhcHNlZE1pbGxpc2Vjb25kczsKfQogCnN0YXRpYyB2b2lkIFRlc3ROb0Nhc3QoKQp7CmZvcmVhY2ggKEUgZSBpbiBFbnVtLkdldFZhbHVlcyh0eXBlb2YoRSkpKQp7CkR1bW15RnVuY3Rpb24oZSk7Cn0KfQogCnN0YXRpYyB2b2lkIFRlc3RDYXN0KCkKewpmb3JlYWNoICh2YXIgZSBpbiAoRVtdKUVudW0uR2V0VmFsdWVzKHR5cGVvZihFKSkpCnsKRHVtbXlGdW5jdGlvbihlKTsKfQp9CiAKc3RhdGljIGludCBkdW1teSA9IDA7CiAKc3RhdGljIHZvaWQgRHVtbXlGdW5jdGlvbihFIGUpCnsKaWYgKGUuVG9TdHJpbmcoKS5Db250YWlucygnMScpKQp7CisrZHVtbXk7Cn0KfQp9Cn0g