using System; using System.Collections.Generic; using System.Linq; using BenchmarkHelper; sealed class LoopsBenchmark { const int Size = 100000; static void Main() { Random rng = new Random(); List doubleList = Enumerable.Range(0, Size) .Select(x => rng.NextDouble()) .ToList(); double[] doubleArray = doubleList.ToArray(); var doubleArraySuite = TestSuite.Create("double[]", doubleArray, doubleArray.Sum()) .Add(input => { double sum = 0; for (int i=0; i < input.Length; i++) sum += input[i]; return sum; }, "For") .Add(input => { double sum = 0; int length = input.Length; for (int i = 0; i < length; i++) sum += input[i]; return sum; }, "ForHoistLength") .Add(input => { double sum = 0; foreach (double d in input) sum += d; return sum; }, "ForEach") .Add(IEnumerableForEach) .Add(Enumerable.Sum, "Enumerable.Sum") .RunTests(); var doubleListSuite = TestSuite.Create("List", doubleList, doubleList.Sum()) .Add(input => { double sum = 0; for (int i = 0; i < input.Count; i++) sum += input[i]; return sum; }, "For") .Add(input => { double sum = 0; int length = input.Count; for (int i = 0; i < length; i++) sum += input[i]; return sum; }, "ForHoistLength") .Add(input => { double sum = 0; foreach (double d in input) sum += d; return sum; }, "ForEach") .Add(IEnumerableForEach) .Add(Enumerable.Sum, "Enumerable.Sum") .RunTests(); GC.Collect(); List intList = Enumerable.Range(0, Size) .Select(x => rng.Next(100)) .ToList(); int[] intArray = intList.ToArray(); var intArraySuite = TestSuite.Create("int[]", intArray, intArray.Sum()) .Add(input => { int sum = 0; for (int i = 0; i < input.Length; i++) sum += input[i]; return sum; }, "For") .Add(input => { int sum = 0; int length = input.Length; for (int i = 0; i < length; i++) sum += input[i]; return sum; }, "ForHoistLength") .Add(input => { int sum = 0; foreach (int d in input) sum += d; return sum; }, "ForEach") .Add(IEnumerableForEach) .Add(Enumerable.Sum, "Enumerable.Sum") .RunTests(); var intListSuite = TestSuite.Create("List", intList, intList.Sum()) .Add(input => { int sum = 0; for (int i = 0; i < input.Count; i++) sum += input[i]; return sum; }, "For") .Add(input => { int sum = 0; int length = input.Count; for (int i = 0; i < length; i++) sum += input[i]; return sum; }, "ForHoistLength") .Add(input => { int sum = 0; foreach (int d in input) sum += d; return sum; }, "ForEach") .Add(IEnumerableForEach) .Add(Enumerable.Sum, "Enumerable.Sum") .RunTests(); var bestDouble = BenchmarkResult.FindBest(doubleArraySuite, doubleListSuite); var bestInt = BenchmarkResult.FindBest(intArraySuite, intListSuite); Console.WriteLine("-------------------- Doubles --------------------"); doubleArraySuite.Display(ResultColumns.NameAndScore, bestDouble); doubleListSuite.Display(ResultColumns.NameAndScore, bestDouble); Console.WriteLine("-------------------- Ints --------------------"); intArraySuite.Display(ResultColumns.NameAndScore, bestInt); intListSuite.Display(ResultColumns.NameAndScore, bestInt); } static double IEnumerableForEach(IEnumerable input) { double sum = 0; foreach (double d in input) { sum += d; } return sum; } static int IEnumerableForEach(IEnumerable input) { int sum = 0; foreach (int d in input) { sum += d; } return sum; } }