Performance Measurement in .NET
Bij het coderen komen nogal eens vragen op als:
Is manier A nu sneller dan manier B of andersom ?
Of: Ik weet dat manier A gebruikt dient te worden want die is sneller dan B, maar hoeveel scheelt het nu daadwerkelijk ?
Om op dit soort vragen antwoord te geven heeft Nick Wienholt een Performance Measurement Framework geschreven.
http://www.dotnetperformance.com/downloads/harnesscode.zip
(Source included)
In dit generieke testframework kan je heel eenvoudig testen uitvoeren zoals hierboven beschreven.
Nick heeft er ook een artikel bij geschreven:
http://www.dotnetperformance.com/downloads/harness.doc
In korte tijd zijn hierin tests te coderen die veelzeggend zijn:
De output kan gekozen worden bijvoorbeeld een graph, messagebox of naar een bestand.
Hieronder volgt een simpele test mbt string.empty of string.length gebruiken:
De grafiek onder de code laat genoeg resultaat zien. (bij een iteratie van 50 miljoen x per method)
using System;
using DotNetPerformance;
namespace Test_Example
{
public class StringTest
{
public TestResult[] RunTest()
{
const int numberIterations = 50000000;
const int numberTestRuns = 5;
TestRunner tr = new TestRunner(numberIterations, numberTestRuns);
TestRunner.TestCase testCases = null;
testCases += new TestRunner.TestCase(this.Method1);
testCases += new TestRunner.TestCase(this.Method2);
testCases += new TestRunner.TestCase(this.Method3);
testCases += new TestRunner.TestCase(this.Method4);
return tr.RunTests(testCases);
}
public void Method1(Int32 NumberIterations)
{
string x = "";
int j = 0;
for (int i = 0;i < NumberIterations;++i)
{
if (x.Length>0)
{
j++;
}
}
}
public void Method2(Int32 NumberIterations)
{
string x = "";
int j = 0;
for (int i = 0;i < NumberIterations;++i)
{
if (x!=string.Empty)
{
j++;
}
}
}
public void Method3(Int32 NumberIterations)
{
string x = "piet";
int j = 0;
for (int i = 0;i < NumberIterations;++i)
{
if (x.Length>0)
{
j++;
}
}
}
public void Method4(Int32 NumberIterations)
{
string x = "piet";
int j = 0;
for (int i = 0;i < NumberIterations;++i)
{
if (x!=string.Empty)
{
j++;
}
}
}
}
}