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 ( "LinqAddXToEven3Loops on {0} with {1} repeats ... " , COUNT, REPEAT) ;
sw.Restart ( ) ;
for ( int i = 0 ; i < REPEAT; i++ ) {
result = LinqAddXToEven3Loops ( buffer, i) ;
}
sw.Stop ( ) ;
Console.WriteLine ( "{0}" , sw.Elapsed ) ;
Console.Write ( "LinqAddXToEven2Loops on {0} with {1} repeats ... " , COUNT, REPEAT) ;
sw.Restart ( ) ;
for ( int i = 0 ; i < REPEAT; i++ ) {
result = LinqAddXToEven2Loops ( buffer, i) ;
}
sw.Stop ( ) ;
Console.WriteLine ( "{0}" , sw.Elapsed ) ;
Console.Write ( "SQLAddXToEven on {0} with {1} repeats ... " , COUNT, REPEAT) ;
sw.Restart ( ) ;
for ( int i = 0 ; i < REPEAT; i++ ) {
result = SQLAddXToEven ( buffer, i) ;
}
sw.Stop ( ) ;
Console.WriteLine ( "{0}" , sw.Elapsed ) ;
Console.Write ( "YieldAddXToEven on {0} with {1} repeats ... " , COUNT, REPEAT) ;
sw.Restart ( ) ;
for ( int i = 0 ; i < REPEAT; i++ ) {
result = YieldAddXToEven ( 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) ;
}
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwp1c2luZyBTeXN0ZW0uTGlucTsKCm5hbWVzcGFjZSBCZW5jaExpbnFMb29wcwp7CgljbGFzcyBNYWluQ2xhc3MKCXsKCQljb25zdCBpbnQgQ09VTlQgPSAxMDAwOwoJCWNvbnN0IGludCBSRVBFQVQgPSAxMDAwMDsKCgkJcHVibGljIHN0YXRpYyB2b2lkIE1haW4gKHN0cmluZ1tdIGFyZ3MpCgkJewoJCQlDb25zb2xlLldyaXRlTGluZSAoIkJlbmNobWFya2luZyBMaW5xIExvb3BzIik7CgoJCQl2YXIgYnVmZmVyID0gbmV3IExpc3Q8aW50PiAoQ09VTlQpOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IENPVU5UOyBpKyspIHsKCQkJCWJ1ZmZlci5BZGQgKGkpOwoJCQl9CgkJCUlFbnVtZXJhYmxlPHN0cmluZz4gcmVzdWx0OwoJCQl2YXIgc3cgPSBuZXcgU3RvcHdhdGNoICgpOwoKCQkJQ29uc29sZS5Xcml0ZSAoIkxpbnFBZGRYVG9FdmVuM0xvb3BzIG9uIHswfSB3aXRoIHsxfSByZXBlYXRzIC4uLiAiLCBDT1VOVCwgUkVQRUFUKTsKCQkJc3cuUmVzdGFydCAoKTsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBSRVBFQVQ7IGkrKykgewoJCQkJcmVzdWx0ID0gTGlucUFkZFhUb0V2ZW4zTG9vcHMgKGJ1ZmZlciwgaSk7CgkJCX0KCQkJc3cuU3RvcCAoKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUgKCJ7MH0iLCBzdy5FbGFwc2VkKTsKCgkJCUNvbnNvbGUuV3JpdGUgKCJMaW5xQWRkWFRvRXZlbjJMb29wcyBvbiB7MH0gd2l0aCB7MX0gcmVwZWF0cyAuLi4gIiwgQ09VTlQsIFJFUEVBVCk7CgkJCXN3LlJlc3RhcnQgKCk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgUkVQRUFUOyBpKyspIHsKCQkJCXJlc3VsdCA9IExpbnFBZGRYVG9FdmVuMkxvb3BzIChidWZmZXIsIGkpOwoJCQl9CgkJCXN3LlN0b3AgKCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lICgiezB9Iiwgc3cuRWxhcHNlZCk7CgoJCQlDb25zb2xlLldyaXRlICgiU1FMQWRkWFRvRXZlbiBvbiB7MH0gd2l0aCB7MX0gcmVwZWF0cyAuLi4gIiwgQ09VTlQsIFJFUEVBVCk7CgkJCXN3LlJlc3RhcnQgKCk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgUkVQRUFUOyBpKyspIHsKCQkJCXJlc3VsdCA9IFNRTEFkZFhUb0V2ZW4gKGJ1ZmZlciwgaSk7CgkJCX0KCQkJc3cuU3RvcCAoKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUgKCJ7MH0iLCBzdy5FbGFwc2VkKTsKCgkJCUNvbnNvbGUuV3JpdGUgKCJZaWVsZEFkZFhUb0V2ZW4gb24gezB9IHdpdGggezF9IHJlcGVhdHMgLi4uICIsIENPVU5ULCBSRVBFQVQpOwoJCQlzdy5SZXN0YXJ0ICgpOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IFJFUEVBVDsgaSsrKSB7CgkJCQlyZXN1bHQgPSBZaWVsZEFkZFhUb0V2ZW4gKGJ1ZmZlciwgaSk7CgkJCX0KCQkJc3cuU3RvcCAoKTsKCQkJQ29uc29sZS5Xcml0ZUxpbmUgKCJ7MH0iLCBzdy5FbGFwc2VkKTsKCQl9CgoJCXN0YXRpYyBJRW51bWVyYWJsZTxzdHJpbmc+IExpbnFBZGRYVG9FdmVuM0xvb3BzIChJRW51bWVyYWJsZTxpbnQ+IGJ1ZmZlciwgaW50IHgpCgkJewoJCQlyZXR1cm4gYnVmZmVyLldoZXJlIChuID0+IChuICUgMikgPT0gMCkuU2VsZWN0IChuID0+IG4gKyB4KS5TZWxlY3QgKG4gPT4gc3RyaW5nLkZvcm1hdCgiSGVsbG8gezB9IiwgbikpOwoJCX0KCgkJc3RhdGljIElFbnVtZXJhYmxlPHN0cmluZz4gTGlucUFkZFhUb0V2ZW4yTG9vcHMgKElFbnVtZXJhYmxlPGludD4gYnVmZmVyLCBpbnQgeCkKCQl7CgkJCXJldHVybiBidWZmZXIuV2hlcmUgKG4gPT4gKG4gJSAyKSA9PSAwKS5TZWxlY3QgKG4gPT4gc3RyaW5nLkZvcm1hdCgiSGVsbG8gezB9IiwgbiArIHgpKTsKCQl9CgoJCXN0YXRpYyBJRW51bWVyYWJsZTxzdHJpbmc+IFNRTEFkZFhUb0V2ZW4gKElFbnVtZXJhYmxlPGludD4gYnVmZmVyLCBpbnQgeCkKCQl7CgkJCXJldHVybiBmcm9tIG4gaW4gYnVmZmVyCgkJCSAgICAgICB3aGVyZSAobiAlIDIpID09IDAKCQkJICAgICAgIHNlbGVjdCBzdHJpbmcuRm9ybWF0ICgiSGVsbG8gezB9IiwgbiArIHgpOwoJCX0KCgkJc3RhdGljIElFbnVtZXJhYmxlPHN0cmluZz4gWWllbGRBZGRYVG9FdmVuIChJRW51bWVyYWJsZTxpbnQ+IGJ1ZmZlciwgaW50IHgpCgkJewoJCQlmb3JlYWNoICh2YXIgbiBpbiBidWZmZXIpIHsKCQkJCWlmICgobiAlIDIpID09IDApIHsKCQkJCQl5aWVsZCByZXR1cm4gc3RyaW5nLkZvcm1hdCAoIkhlbGxvIHswfSIsIG4gKyB4KTsKCQkJCX0KCQkJfQoJCX0KCX0KfQo=