using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace BenchLinqLoops
{
class MainClass
{
const int COUNT = 1000;
const int REPEAT = 10000;
public static void Main (string[] args)
{
Console.WriteLine ("Benchmarking Linq Loops");
var buffer = new List<int> (COUNT);
for (int i = 0; i < COUNT; i++) {
buffer.Add (i);
}
IEnumerable<string> result;
var sw = new Stopwatch ();
Console.Write ("YieldAddXToEven on {0} with {1} repeats ... ", COUNT, REPEAT);
for (int i = 0; i < REPEAT; i++) {
result = YieldAddXToEven (buffer, i);
}
sw.Restart ();
for (int i = 0; i < REPEAT; i++) {
result = YieldAddXToEven (buffer, i);
}
sw.Stop ();
Console.WriteLine ("{0}", sw.Elapsed);
Console.Write ("SQLAddXToEven on {0} with {1} repeats ... ", COUNT, REPEAT);
for (int i = 0; i < REPEAT; i++) {
result = SQLAddXToEven (buffer, i);
}
sw.Restart ();
for (int i = 0; i < REPEAT; i++) {
result = SQLAddXToEven (buffer, i);
}
sw.Stop ();
Console.WriteLine ("{0}", sw.Elapsed);
Console.Write ("LinqAddXToEven2Loops on {0} with {1} repeats ... ", COUNT, REPEAT);
for (int i = 0; i < REPEAT; i++) {
result = LinqAddXToEven2Loops (buffer, i);
}
sw.Restart ();
for (int i = 0; i < REPEAT; i++) {
result = LinqAddXToEven2Loops (buffer, i);
}
sw.Stop ();
Console.WriteLine ("{0}", sw.Elapsed);
Console.Write ("LinqAddXToEven3Loops on {0} with {1} repeats ... ", COUNT, REPEAT);
for (int i = 0; i < REPEAT; i++) {
result = LinqAddXToEven3Loops (buffer, i);
}
sw.Restart ();
for (int i = 0; i < REPEAT; i++) {
result = LinqAddXToEven3Loops (buffer, i);
}
sw.Stop ();
Console.WriteLine ("{0}", sw.Elapsed);
}
static IEnumerable<string> LinqAddXToEven3Loops (IEnumerable<int> buffer, int x)
{
return buffer.Where (n => (n % 2) == 0).Select (n => n + x).Select (n => string.Format("Hello {0}", n));
}
static IEnumerable<string> LinqAddXToEven2Loops (IEnumerable<int> buffer, int x)
{
return buffer.Where (n => (n % 2) == 0).Select (n => string.Format("Hello {0}", n + x));
}
static IEnumerable<string> SQLAddXToEven (IEnumerable<int> buffer, int x)
{
return from n in buffer
where (n % 2) == 0
select string.Format ("Hello {0}", n + x);
}
static IEnumerable<string> YieldAddXToEven (IEnumerable<int> buffer, int x)
{
foreach (var n in buffer) {
if ((n % 2) == 0) {
yield return string.Format ("Hello {0}", n + x);
}
}
}
}
}