using System; using System.Diagnostics; using System.Collections.Generic; class ForEachBenchmark { const int Iterations = 10000; const int Size = 100000; static void Main() { Console.WriteLine ("Test parameters: Size={0}; Iterations={1}", Size, Iterations); List list = new List(); for (int i=0; i < Size; i++) { list.Add("x"); } RunTest(list, LanguageForEach); RunTest(list, NewDelegateEachTime); RunTest(list, CachedDelegate); RunTest(list, LanguageForEachWithCopy1); RunTest(list, LanguageForEachWithCopy2); } delegate int ForEachTest(List list); static void RunTest(List list, ForEachTest test) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); int sum = test(list); TimeSpan time = stopwatch.Elapsed; if (sum != Iterations*Size) { Console.WriteLine ("Error in test {0}", test.Method.Name); } Console.WriteLine ("Test {0}: {1}", time, test.Method.Name); } static int LanguageForEach(List list) { int sum = 0; for (int i=0; i < Iterations; i++) { foreach (string s in list) { sum += s.Length; } } return sum; } static int LanguageForEachWithCopy1(List list) { int sum = 0; for (int i=0; i < Iterations; i++) { string[] array = new string[list.Count]; list.CopyTo(array, 0); foreach (string s in array) { sum += s.Length; } } return sum; } static int LanguageForEachWithCopy2(List list) { string[] array = new string[list.Count]; list.CopyTo(array, 0); int sum = 0; for (int i=0; i < Iterations; i++) { foreach (string s in array) { sum += s.Length; } } return sum; } static int NewDelegateEachTime(List list) { int sum = 0; for (int i=0; i < Iterations; i++) { // Note: Just using sum instead isn't good enough, // as then a single delegate is used (equivalent to // CachedDelegate). In this test, "count" is captured // separately for each outer iteration. int count=0; list.ForEach (delegate(string s) { count += s.Length; }); sum += count; } return sum; } static int CachedDelegate(List list) { int sum = 0; Action action = delegate(string s) { sum += s.Length; }; for (int i=0; i < Iterations; i++) { list.ForEach (action); } return sum; } }