fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5.  
  6. namespace BenchLinqLoops
  7. {
  8. class MainClass
  9. {
  10. const int COUNT = 1000;
  11. const int REPEAT = 10000;
  12.  
  13. public static void Main (string[] args)
  14. {
  15. Console.WriteLine ("Benchmarking Linq Loops");
  16.  
  17. var buffer = new List<int> (COUNT);
  18. for (int i = 0; i < COUNT; i++) {
  19. buffer.Add (i);
  20. }
  21. IEnumerable<string> result;
  22. var sw = new Stopwatch ();
  23.  
  24. Console.Write ("YieldAddXToEven on {0} with {1} repeats ... ", COUNT, REPEAT);
  25. for (int i = 0; i < REPEAT; i++) {
  26. result = YieldAddXToEven (buffer, i);
  27. }
  28. sw.Restart ();
  29. for (int i = 0; i < REPEAT; i++) {
  30. result = YieldAddXToEven (buffer, i);
  31. }
  32. sw.Stop ();
  33. Console.WriteLine ("{0}", sw.Elapsed);
  34.  
  35. Console.Write ("SQLAddXToEven on {0} with {1} repeats ... ", COUNT, REPEAT);
  36. for (int i = 0; i < REPEAT; i++) {
  37. result = SQLAddXToEven (buffer, i);
  38. }
  39. sw.Restart ();
  40. for (int i = 0; i < REPEAT; i++) {
  41. result = SQLAddXToEven (buffer, i);
  42. }
  43. sw.Stop ();
  44. Console.WriteLine ("{0}", sw.Elapsed);
  45.  
  46. Console.Write ("LinqAddXToEven2Loops on {0} with {1} repeats ... ", COUNT, REPEAT);
  47. for (int i = 0; i < REPEAT; i++) {
  48. result = LinqAddXToEven2Loops (buffer, i);
  49. }
  50. sw.Restart ();
  51. for (int i = 0; i < REPEAT; i++) {
  52. result = LinqAddXToEven2Loops (buffer, i);
  53. }
  54. sw.Stop ();
  55. Console.WriteLine ("{0}", sw.Elapsed);
  56.  
  57. Console.Write ("LinqAddXToEven3Loops on {0} with {1} repeats ... ", COUNT, REPEAT);
  58. for (int i = 0; i < REPEAT; i++) {
  59. result = LinqAddXToEven3Loops (buffer, i);
  60. }
  61. sw.Restart ();
  62. for (int i = 0; i < REPEAT; i++) {
  63. result = LinqAddXToEven3Loops (buffer, i);
  64. }
  65. sw.Stop ();
  66. Console.WriteLine ("{0}", sw.Elapsed);
  67. }
  68.  
  69. static IEnumerable<string> LinqAddXToEven3Loops (IEnumerable<int> buffer, int x)
  70. {
  71. return buffer.Where (n => (n % 2) == 0).Select (n => n + x).Select (n => string.Format("Hello {0}", n));
  72. }
  73.  
  74. static IEnumerable<string> LinqAddXToEven2Loops (IEnumerable<int> buffer, int x)
  75. {
  76. return buffer.Where (n => (n % 2) == 0).Select (n => string.Format("Hello {0}", n + x));
  77. }
  78.  
  79. static IEnumerable<string> SQLAddXToEven (IEnumerable<int> buffer, int x)
  80. {
  81. return from n in buffer
  82. where (n % 2) == 0
  83. select string.Format ("Hello {0}", n + x);
  84. }
  85.  
  86. static IEnumerable<string> YieldAddXToEven (IEnumerable<int> buffer, int x)
  87. {
  88. foreach (var n in buffer) {
  89. if ((n % 2) == 0) {
  90. yield return string.Format ("Hello {0}", n + x);
  91. }
  92. }
  93. }
  94. }
  95. }
  96.  
Success #stdin #stdout 0.07s 24024KB
stdin
Standard input is empty
stdout
Benchmarking Linq Loops
YieldAddXToEven on 1000 with 10000 repeats ... 00:00:00.0005988
SQLAddXToEven on 1000 with 10000 repeats ... 00:00:00.0020347
LinqAddXToEven2Loops on 1000 with 10000 repeats ... 00:00:00.0014414
LinqAddXToEven3Loops on 1000 with 10000 repeats ... 00:00:00.0018629