using System.Runtime.InteropServices;
using System.Threading;
public class Test
{
[DllImport("kernel32.dll")]
private static extern bool QueryPerformanceFrequency(ref Int64 lpFrequency);
[DllImport("kernel32.dll")]
private static extern bool QueryPerformanceCounter(ref Int64 lpPerformanceCount);
public static void Main(string [] args)
{
long frequency = 0;
if(!QueryPerformanceFrequency(ref frequency))
{
Console.WriteLine("not supported.");
return;
}
long start = 0;
if(!QueryPerformanceCounter(ref start))
{
Console.WriteLine("query start failed.");
return;
}
Thread.Sleep(1000);
long end = 0;
if(!QueryPerformanceCounter(ref end))
{
Console.WriteLine("query end failed.");
return;
}
Console.WriteLine("frequency = {0}, total time {1}",
frequency, (double)(end - start)/((double)frequency));
}
}
结果应当和下面差不多(frequency会有差异)
frequency = 1193182, total time 0.999754438132657
在 Visual C# .NET 中使用 QueryPerformanceCounter 测定代码的运行用时
概要
在对代码进行测试以找出性能瓶颈时,您希望使用系统所能提供的精度最高的计时器。 本分步指南描述如何使用 QueryPerformanceCounter 函数测定应用程序代码的运行用时。
备注: JScript .NET 不能调用 Microsoft Windows API 函数。
备注: JScript .NET 不能调用 Microsoft Windows API 函数。
生成和运行演示应用程序
1. | 启动 Visual Studio .NET 并新建一个 Visual C# 控制台应用程序。 |
2. |
将默认代码替换为以下代码,其操作计时的增量为 100: using System; using System.Runtime.InteropServices; namespace csConPerfCounter { class Class1 { [DllImport("kernel32.dll")] extern static short QueryPerformanceCounter(ref long x); [DllImport("kernel32.dll")] extern static short QueryPerformanceFrequency(ref long x); static void Main(string[] args) { long ctr1 = 0, ctr2 = 0, freq = 0; int acc = 0, i = 0; if (QueryPerformanceCounter(ref ctr1)!=0) // Begin timing. { for (i=0; i<100; i++) acc++; // Code being timed. QueryPerformanceCounter(ref ctr2); // Finish timing. Console.WriteLine("Start Value: " + ctr1); Console.WriteLine("End Value: " + ctr2); QueryPerformanceFrequency(ref freq); Console.WriteLine("QueryPerformanceCounter minimum resolution: 1/" + freq + " seconds."); Console.WriteLine("100 Increment time: " + (ctr2 - ctr1) * 1.0 / freq + " seconds."); } else Console.WriteLine("High-resolution counter not supported."); // Make the console window wait. Console.WriteLine(); Console.Write("Press Enter to finish ... "); Console.Read(); } } } |
3. | 保存应用程序,按 F5 键编译并运行该应用程序。控制台窗口的输出显示应类似于如下所示:
Start Value: 281060816204 End Value: 281060816269 QueryPerformanceCounter minimum resolution: 1/3579545 seconds. 100 Increment time: 1.81587324646009E-05 seconds. Press Enter to finish ... |
4. | 按 ENTER 键停止运行应用程序并关闭控制台窗口。 |