fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. #if !NEW
  5. using System.Linq;
  6. #endif
  7.  
  8. public class Prog
  9. {
  10. const int Iterations = 1000000;
  11.  
  12. private static List<TimeSpan> times = new List<TimeSpan>();
  13.  
  14. public static void Main()
  15. {
  16. AllNulls();
  17. HalfNullHalfNonNull();
  18. AllNonNull();
  19. DumpTimes();
  20. }
  21.  
  22. static void AllNulls()
  23. {
  24. var array = RepeatArray<int?>(null);
  25. AddTime(() => array.Sum());
  26.  
  27. var array2 = RepeatArray<long?>(null);
  28. AddTime(() => array2.Sum());
  29.  
  30. var array3 = RepeatArray<float?>(null);
  31. AddTime(() => array3.Sum());
  32.  
  33. var array4 = RepeatArray<double?>(null);
  34. AddTime(() => array4.Sum());
  35.  
  36. var array5 = RepeatArray<decimal?>(null);
  37. AddTime(() => array5.Sum());
  38. }
  39.  
  40. static void HalfNullHalfNonNull()
  41. {
  42. var array = HalfAndHalf<int?>(null, 1);
  43. AddTime(() => array.Sum());
  44.  
  45. var array2 = HalfAndHalf<long?>(null, 1);
  46. AddTime(() => array2.Sum());
  47.  
  48. var array3 = HalfAndHalf<float?>(null, 1);
  49. AddTime(() => array3.Sum());
  50.  
  51. var array4 = HalfAndHalf<double?>(null, 1);
  52. AddTime(() => array4.Sum());
  53.  
  54. var array5 = HalfAndHalf<decimal?>(null, 1);
  55. AddTime(() => array5.Sum());
  56. }
  57.  
  58. static void AllNonNull()
  59. {
  60. var array = RepeatArray<int?>(1);
  61. AddTime(() => array.Sum());
  62.  
  63. var array2 = RepeatArray<long?>(1);
  64. AddTime(() => array2.Sum());
  65.  
  66. var array3 = RepeatArray<float?>(1);
  67. AddTime(() => array3.Sum());
  68.  
  69. var array4 = RepeatArray<double?>(1);
  70. AddTime(() => array4.Sum());
  71.  
  72. var array5 = RepeatArray<decimal?>(1);
  73. AddTime(() => array5.Sum());
  74. }
  75.  
  76. static void AddTime<T>(Func<T> longRunning)
  77. {
  78. times.Add(Time(longRunning));
  79. }
  80.  
  81. static TimeSpan Time<T>(Func<T> longRunning)
  82. {
  83. // Stopwatch.StartNew is noticeably slower than doing it manually
  84. var watch = new Stopwatch();
  85. watch.Start();
  86.  
  87. T obj = longRunning();
  88.  
  89. watch.Stop();
  90. GC.KeepAlive(obj);
  91. return watch.Elapsed;
  92. }
  93.  
  94. static T[] RepeatArray<T>(T value)
  95. {
  96. return System.Linq.Enumerable.ToArray(
  97. System.Linq.Enumerable.Repeat(value, Iterations));
  98. }
  99.  
  100. static T[] HalfAndHalf<T>(T first, T second)
  101. {
  102. return System.Linq.Enumerable.ToArray(
  103. System.Linq.Enumerable.Concat(
  104. System.Linq.Enumerable.Repeat(first, Iterations / 2),
  105. System.Linq.Enumerable.Repeat(second, Iterations / 2)));
  106. }
  107.  
  108. static void DumpTimes()
  109. {
  110. for (int i = 0; i < times.Count; i++)
  111. Console.WriteLine(times[i]);
  112. }
  113. }
  114.  
  115. #if NEW
  116. public static class Sums
  117. {
  118. public static int? Sum(this IEnumerable<int?> source)
  119. {
  120. if (source == null);
  121. int sum = 0;
  122. checked
  123. {
  124. foreach (int? v in source)
  125. {
  126. sum += v.GetValueOrDefault();
  127. }
  128. }
  129. return sum;
  130. }
  131.  
  132. public static long? Sum(this IEnumerable<long?> source)
  133. {
  134. if (source == null);
  135. long sum = 0;
  136. checked
  137. {
  138. foreach (long? v in source)
  139. {
  140. sum += v.GetValueOrDefault();
  141. }
  142. }
  143. return sum;
  144. }
  145.  
  146. public static float? Sum(this IEnumerable<float?> source)
  147. {
  148. if (source == null);
  149. double sum = 0;
  150. foreach (float? v in source)
  151. {
  152. sum += v.GetValueOrDefault();
  153. }
  154. return (float)sum;
  155. }
  156.  
  157. public static double? Sum(this IEnumerable<double?> source)
  158. {
  159. if (source == null);
  160. double sum = 0;
  161. foreach (double? v in source)
  162. {
  163. sum += v.GetValueOrDefault();
  164. }
  165. return sum;
  166. }
  167.  
  168. public static decimal? Sum(this IEnumerable<decimal?> source)
  169. {
  170. if (source == null);
  171. decimal sum = 0;
  172. foreach (decimal? v in source)
  173. {
  174. sum += v.GetValueOrDefault();
  175. }
  176. return sum;
  177. }
  178. }
  179. #endif
Success #stdin #stdout 2.13s 24272KB
stdin
Standard input is empty
stdout
00:00:00.0369312
00:00:00.0426586
00:00:00.0404007
00:00:00.0458573
00:00:00.0598210
00:00:00.0382865
00:00:00.0442971
00:00:00.0408288
00:00:00.0454245
00:00:00.0715751
00:00:00.0394582
00:00:00.0468006
00:00:00.0433465
00:00:00.0506068
00:00:00.0862176