using System; using System.Collections.Generic; using System.Diagnostics; #if !NEW using System.Linq; #endif public class Prog { const int Iterations = 1000000; private static List times = new List(); public static void Main() { AllNulls(); HalfNullHalfNonNull(); AllNonNull(); DumpTimes(); } static void AllNulls() { var array = RepeatArray(null); AddTime(() => array.Sum()); var array2 = RepeatArray(null); AddTime(() => array2.Sum()); var array3 = RepeatArray(null); AddTime(() => array3.Sum()); var array4 = RepeatArray(null); AddTime(() => array4.Sum()); var array5 = RepeatArray(null); AddTime(() => array5.Sum()); } static void HalfNullHalfNonNull() { var array = HalfAndHalf(null, 1); AddTime(() => array.Sum()); var array2 = HalfAndHalf(null, 1); AddTime(() => array2.Sum()); var array3 = HalfAndHalf(null, 1); AddTime(() => array3.Sum()); var array4 = HalfAndHalf(null, 1); AddTime(() => array4.Sum()); var array5 = HalfAndHalf(null, 1); AddTime(() => array5.Sum()); } static void AllNonNull() { var array = RepeatArray(1); AddTime(() => array.Sum()); var array2 = RepeatArray(1); AddTime(() => array2.Sum()); var array3 = RepeatArray(1); AddTime(() => array3.Sum()); var array4 = RepeatArray(1); AddTime(() => array4.Sum()); var array5 = RepeatArray(1); AddTime(() => array5.Sum()); } static void AddTime(Func longRunning) { times.Add(Time(longRunning)); } static TimeSpan Time(Func longRunning) { // Stopwatch.StartNew is noticeably slower than doing it manually var watch = new Stopwatch(); watch.Start(); T obj = longRunning(); watch.Stop(); GC.KeepAlive(obj); return watch.Elapsed; } static T[] RepeatArray(T value) { return System.Linq.Enumerable.ToArray( System.Linq.Enumerable.Repeat(value, Iterations)); } static T[] HalfAndHalf(T first, T second) { return System.Linq.Enumerable.ToArray( System.Linq.Enumerable.Concat( System.Linq.Enumerable.Repeat(first, Iterations / 2), System.Linq.Enumerable.Repeat(second, Iterations / 2))); } static void DumpTimes() { for (int i = 0; i < times.Count; i++) Console.WriteLine(times[i]); } } #if NEW public static class Sums { public static int? Sum(this IEnumerable source) { if (source == null); int sum = 0; checked { foreach (int? v in source) { sum += v.GetValueOrDefault(); } } return sum; } public static long? Sum(this IEnumerable source) { if (source == null); long sum = 0; checked { foreach (long? v in source) { sum += v.GetValueOrDefault(); } } return sum; } public static float? Sum(this IEnumerable source) { if (source == null); double sum = 0; foreach (float? v in source) { sum += v.GetValueOrDefault(); } return (float)sum; } public static double? Sum(this IEnumerable source) { if (source == null); double sum = 0; foreach (double? v in source) { sum += v.GetValueOrDefault(); } return sum; } public static decimal? Sum(this IEnumerable source) { if (source == null); decimal sum = 0; foreach (decimal? v in source) { sum += v.GetValueOrDefault(); } return sum; } } #endif