开胃菜的好伙伴们,
我正在尝试在C#中创建一个Timing类,它可以输出执行特定行代码所需的时间。这是我到目前为止开发的类(它使用QueryPerformanceCounter):
class Timing
{
private long start;
private long stop;
private long frequency;
Decimal multiplier = new Decimal(1.0e9);
// Importing important DLL's that will be used
[DllImport("KERNEL32")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
// Timing constructor
public Timing()
{
if (QueryPerformanceFrequency(out frequency) == false)
{
// Frequency not supported
throw new Win32Exception();
}
}
// Method for starting the counter
public void Start()
{
QueryPerformanceCounter(out start);
}
// Method for stopping the counter
public void Stop()
{
QueryPerformanceCounter(out stop);
}
// Returns the average time between iterations in nanoseconds
public double Duration(int iterations)
{
return ((((double)(stop - start) * (double)multiplier) / (double)frequency) / iterations);
}
// Get the elapsed time between the start and the stop function in nanoseconds
public double getElapsedTime()
{
return (((double)(stop - start) * (double)multiplier) / (double)frequency);
}
}
我想执行一项测试,看看我的Timing类是否会在连续五次执行相同代码行时打印相同的时间:
static void Main(string[] args)
{
runCollectionTest(1000);
runCollectionTest(1000);
runCollectionTest(1000);
runCollectionTest(1000);
runCollectionTest(1000);
while (true) ;
}
public static void runCollectionTest(int iterations)
{
Timing timer = new Timing();
timer.Start();
ArrayList list = new ArrayList();
for (int i = 0; i < iterations; i++)
{
list.Add(i);
}
timer.Stop();
Console.WriteLine("Time elapsed: " + timer.getElapsedTime() / 1000000 + " milliseconds");
}
以下是代码的输出:
Time elapsed: 0,24631157341192 milliseconds
Time elapsed: 0,0486376114202896 milliseconds
Time elapsed: 0,0620241099763327 milliseconds
Time elapsed: 0,0589005936465893 milliseconds
Time elapsed: 0,088350890469884 milliseconds
我不知道第一次过去和第二次与其他结果相比有多大差异。