using System;
using System.Collections .Generic ;
using System.Diagnostics ;
using System.Linq ;
namespace ConsoleApplication58
{
internal class Program
{
private class A
{
}
private static bool F< T> ( T a, T b) where T : class
{
return a == b;
}
private static bool F2( A a, A b)
{
return a == b;
}
private static void Main( )
{
const int rounds = 100 , n = 10000000 ;
var a = new A( ) ;
var fList = new List< TimeSpan> ( ) ;
var f2List = new List< TimeSpan> ( ) ;
for ( int i = 0 ; i < rounds; i++ )
{
//test generic
GCClear( ) ;
bool res;
var sw = new Stopwatch( ) ;
sw.Start ( ) ;
for ( int j = 0 ; j < n; j++ )
{
res = F( a, a) ;
}
sw.Stop ( ) ;
fList.Add ( sw.Elapsed ) ;
//test not-generic
GCClear( ) ;
bool res2;
var sw2 = new Stopwatch( ) ;
sw2.Start ( ) ;
for ( int j = 0 ; j < n; j++ )
{
res = F2( a, a) ;
}
sw2.Stop ( ) ;
f2List.Add ( sw2.Elapsed ) ;
}
double f1AverageTicks = fList.Average ( ts => ts.Ticks ) ;
Console.WriteLine ( "Elapsed for F = {0} \t ticks = {1}" , fList.Average ( ts => ts.TotalMilliseconds ) ,
f1AverageTicks) ;
double f2AverageTicks = f2List.Average ( ts => ts.Ticks ) ;
Console.WriteLine ( "Elapsed for F2 = {0} \t ticks = {1}" , f2List.Average ( ts => ts.TotalMilliseconds ) ,
f2AverageTicks) ;
Console.WriteLine ( "Not-generic method is {0} times faster, or on {1}%" , f1AverageTicks/ f2AverageTicks,
( f1AverageTicks/ f2AverageTicks - 1 ) * 100 ) ;
Console.ReadKey ( ) ;
}
private static void GCClear( )
{
GC.Collect ( ) ;
GC.WaitForPendingFinalizers ( ) ;
GC.Collect ( ) ;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwp1c2luZyBTeXN0ZW0uTGlucTsKCm5hbWVzcGFjZSBDb25zb2xlQXBwbGljYXRpb241OAp7CiAgICBpbnRlcm5hbCBjbGFzcyBQcm9ncmFtCiAgICB7CiAgICAgICAgcHJpdmF0ZSBjbGFzcyBBCiAgICAgICAgewoKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgRjxUPihUIGEsIFQgYikgd2hlcmUgVCA6IGNsYXNzCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gYSA9PSBiOwogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBGMihBIGEsIEEgYikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBhID09IGI7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1haW4oKQogICAgICAgIHsKICAgICAgICAgICAgY29uc3QgaW50IHJvdW5kcyA9IDEwMCwgbiA9IDEwMDAwMDAwOwogICAgICAgICAgICB2YXIgYSA9IG5ldyBBKCk7CiAgICAgICAgICAgIHZhciBmTGlzdCA9IG5ldyBMaXN0PFRpbWVTcGFuPigpOwogICAgICAgICAgICB2YXIgZjJMaXN0ID0gbmV3IExpc3Q8VGltZVNwYW4+KCk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91bmRzOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vdGVzdCBnZW5lcmljCiAgICAgICAgICAgICAgICBHQ0NsZWFyKCk7CiAgICAgICAgICAgICAgICBib29sIHJlczsKICAgICAgICAgICAgICAgIHZhciBzdyA9IG5ldyBTdG9wd2F0Y2goKTsKICAgICAgICAgICAgICAgIHN3LlN0YXJ0KCk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXMgPSBGKGEsIGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3cuU3RvcCgpOwogICAgICAgICAgICAgICAgZkxpc3QuQWRkKHN3LkVsYXBzZWQpOwoKICAgICAgICAgICAgICAgIC8vdGVzdCBub3QtZ2VuZXJpYwogICAgICAgICAgICAgICAgR0NDbGVhcigpOwogICAgICAgICAgICAgICAgYm9vbCByZXMyOwogICAgICAgICAgICAgICAgdmFyIHN3MiA9IG5ldyBTdG9wd2F0Y2goKTsKICAgICAgICAgICAgICAgIHN3Mi5TdGFydCgpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzID0gRjIoYSwgYSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdzIuU3RvcCgpOwogICAgICAgICAgICAgICAgZjJMaXN0LkFkZChzdzIuRWxhcHNlZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG91YmxlIGYxQXZlcmFnZVRpY2tzID0gZkxpc3QuQXZlcmFnZSh0cyA9PiB0cy5UaWNrcyk7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFbGFwc2VkIGZvciBGID0gezB9IFx0IHRpY2tzID0gezF9IiwgZkxpc3QuQXZlcmFnZSh0cyA9PiB0cy5Ub3RhbE1pbGxpc2Vjb25kcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxQXZlcmFnZVRpY2tzKTsKICAgICAgICAgICAgZG91YmxlIGYyQXZlcmFnZVRpY2tzID0gZjJMaXN0LkF2ZXJhZ2UodHMgPT4gdHMuVGlja3MpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRWxhcHNlZCBmb3IgRjIgPSB7MH0gXHQgdGlja3MgPSB7MX0iLCBmMkxpc3QuQXZlcmFnZSh0cyA9PiB0cy5Ub3RhbE1pbGxpc2Vjb25kcyksCiAgICAgICAgICAgICAgICAgIGYyQXZlcmFnZVRpY2tzKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk5vdC1nZW5lcmljIG1ldGhvZCBpcyB7MH0gdGltZXMgZmFzdGVyLCBvciBvbiB7MX0lIiwgZjFBdmVyYWdlVGlja3MvZjJBdmVyYWdlVGlja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmMUF2ZXJhZ2VUaWNrcy9mMkF2ZXJhZ2VUaWNrcyAtIDEpKjEwMCk7CiAgICAgICAgICAgIENvbnNvbGUuUmVhZEtleSgpOwogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBHQ0NsZWFyKCkKICAgICAgICB7CiAgICAgICAgICAgIEdDLkNvbGxlY3QoKTsKICAgICAgICAgICAgR0MuV2FpdEZvclBlbmRpbmdGaW5hbGl6ZXJzKCk7CiAgICAgICAgICAgIEdDLkNvbGxlY3QoKTsKICAgICAgICB9CiAgICB9Cn0K