среда, 10 марта 2010 г.

Исключение работает в 30 тысяч раз медленнее!

Вот такой результат

Test1
Start Value: 48570986229
End Value: 48570988285
QueryPerformanceCounter minimum resolution: 1/3579545 seconds.
Increment time: 0,00057437467611107 seconds.
Test2
Start Value: 48570989868
End Value: 48627848797
QueryPerformanceCounter minimum resolution: 1/3579545 seconds.
Increment time: 15,8844012297652 seconds.
First was 27655,12 faster

Press Enter to finish ...

Выдаёт вот такая программа:



static class Program
{

[DllImport("kernel32.dll")]
extern static short QueryPerformanceCounter(ref long x);
[DllImport("kernel32.dll")]
extern static short QueryPerformanceFrequency(ref long x);

const int count = 5000;

static bool IsEven1(int value)
{
if ((value % 2) == 0)
{
return true;
}
else
{
return false;
}
}

static void IsEven2(int value)
{
if ((value % 2) == 0)
{
return;
}
else
{
throw new Odd();
}
}

static void Test1()
{
int c1 = 0;
int c2 = 0;

for (int i = 0; i < count; ++i)
{
if (IsEven1(i))
{
c1++;
}
else
{
c2++;
}
}
}

static void Test2()
{
int c1 = 0;
int c2 = 0;

for (int i = 0; i < count; ++i)
{
try
{
IsEven2(i);
c1++;
}
catch (Odd)
{
c2++;
}
}
}


static void Main()
{
long ctr1 = 0, ctr2 = 0, freq = 0;
double itime1 = 0, itime2 = 0;

QueryPerformanceFrequency(ref freq);

Console.WriteLine("Test1");
if (QueryPerformanceCounter(ref ctr1) != 0) // Begin timing.
{

Test1();


QueryPerformanceCounter(ref ctr2); // Finish timing.
Console.WriteLine("Start Value: " + ctr1);
Console.WriteLine("End Value: " + ctr2);

Console.WriteLine("QueryPerformanceCounter minimum resolution: 1/" + freq + " seconds.");
itime1 = (ctr2 - ctr1) * 1.0 / freq;
Console.WriteLine("Increment time: " + itime1 + " seconds.");
}
else
Console.WriteLine("High-resolution counter not supported.");

Console.WriteLine("Test2");
if (QueryPerformanceCounter(ref ctr1) != 0) // Begin timing.
{

Test2();

QueryPerformanceCounter(ref ctr2); // Finish timing.
Console.WriteLine("Start Value: " + ctr1);
Console.WriteLine("End Value: " + ctr2);

Console.WriteLine("QueryPerformanceCounter minimum resolution: 1/" + freq + " seconds.");
itime2 = (ctr2 - ctr1) * 1.0 / freq;
Console.WriteLine("Increment time: " + itime2 + " seconds.");
}
else
Console.WriteLine("High-resolution counter not supported.");


Console.WriteLine("First was " + (itime2/itime1).ToString("#.00") + " faster");


// Make the console window wait.

Console.WriteLine();
Console.Write("Press Enter to finish ... ");
Console.Read();

}
}

public class Odd : Exception
{
}