fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5.  
  6. namespace EnumTest
  7. {
  8. public class Program
  9. {
  10. enum E
  11. {
  12. 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,
  13. 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,
  14. 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,
  15. 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,
  16. 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,
  17. 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,
  18. 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,
  19. 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,
  20. 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,
  21. 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,
  22. 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,
  23. 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,
  24. 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,
  25. 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,
  26. 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,
  27. 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,
  28. 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,
  29. 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,
  30. 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,
  31. V494, V495, V496, V497, V498, V499, V500
  32. }
  33.  
  34. static void Main(string[] args)
  35. {
  36. const int IterationCount = 1000;
  37.  
  38. Warmup(IterationCount);
  39.  
  40. Action noCastCall = () => TestNoCast();
  41. Action castCall = () => TestCast();
  42.  
  43. Stopwatch sw = new Stopwatch();
  44.  
  45. var noCast = Enumerable
  46. .Range(0, IterationCount)
  47. .Select(i => Measure(sw, noCastCall))
  48. .ToArray();
  49.  
  50. var cast = Enumerable
  51. .Range(0, IterationCount)
  52. .Select(i => Measure(sw, castCall))
  53. .ToArray();
  54.  
  55. var noCastAvg = Average(noCast);
  56. var castAvg = Average(cast);
  57. var noCastStdDev = StandardDeviation(noCastAvg, noCast);
  58. var castStdDev = StandardDeviation(castAvg, cast);
  59.  
  60. Console.WriteLine("No cast:" + noCastAvg + " +- " + noCastStdDev + "ms");
  61. Console.WriteLine("Cast:" + castAvg + " +- " + castStdDev + "ms");
  62.  
  63. }
  64.  
  65. static void Warmup(int iterationCount)
  66. {
  67. foreach (var x in Enumerable.Range(0, iterationCount))
  68. {
  69. TestNoCast();
  70. TestCast();
  71. TestCast();
  72. TestNoCast();
  73. }
  74. }
  75.  
  76. static double Average(long[] values)
  77. {
  78. return 1.0 * values.Sum() / values.Length;
  79. }
  80.  
  81. static double StandardDeviation(double average, long[] values)
  82. {
  83. return Math.Sqrt(values.Select(x => (x - average) * (x - average)).Sum() / values.Length);
  84. }
  85.  
  86. static long Measure(Stopwatch sw, Action a)
  87. {
  88. sw.Reset();
  89. sw.Start();
  90. a();
  91. sw.Stop();
  92. return sw.ElapsedMilliseconds;
  93. }
  94.  
  95. static void TestNoCast()
  96. {
  97. foreach (E e in Enum.GetValues(typeof(E)))
  98. {
  99. DummyFunction(e);
  100. }
  101. }
  102.  
  103. static void TestCast()
  104. {
  105. foreach (var e in (E[])Enum.GetValues(typeof(E)))
  106. {
  107. DummyFunction(e);
  108. }
  109. }
  110.  
  111. static int dummy = 0;
  112.  
  113. static void DummyFunction(E e)
  114. {
  115. if (e.ToString().Contains('1'))
  116. {
  117. ++dummy;
  118. }
  119. }
  120. }
  121. }
Success #stdin #stdout 4.96s 25152KB
stdin
Standard input is empty
stdout
No cast:0.006 +- 0.0772269383052304ms
Cast:0 +- 0ms