结论: 推荐调用timeBeginPeriod后使用Sleep(1)精度在2ms以内
DateTime.Now
该属性发解析取决于系统计时器, 后者取决于基础操作系统, 精度一般介于0.5~15ms之间
该属性通常用于度量性能, 由于分辨路较低不适合用于测试工具, 推荐使用Stopwatch类
Stopwatch
Stopwatch内部使用系统API QueryPerformanceCounter / QueryPerformanceFrequency
来进行高精度计时,
精度依赖于硬件通常高达几十纳秒(ns)
测试一
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Stopwatch sw = new Stopwatch(); sw.Start(); Thread.Sleep(1); sw.Stop(); TimeSpan timeSpan = sw.Elapsed;
double ms = timeSpan.TotalMilliseconds;
|
测试二
1 2 3 4 5 6 7 8 9 10 11 12
| [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")] public static extern uint BeginPeriod(uint ms); BeginPeriod(1); Stopwatch sw = new Stopwatch(); sw.Start(); Thread.Sleep(1); sw.Stop(); TimeSpan timeSpan = sw.Elapsed;
double ms = timeSpan.TotalMilliseconds;
|
测试三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| [DllImport("kernel32.dll")] public static extern short QueryPerformanceCounter(ref long x); [DllImport("kernel32.dll")] public static extern short QueryPerformanceFrequency(ref long x);
public void delay(long delayTime) { long stopValue = 0, startValue = 0, freq = 0, n = 0; QueryPerformanceFrequency(ref freq); long count = delayTime * freq / 1000000; QueryPerformanceCounter(ref startValue); while(n < count) { QueryPerformanceCounter(ref stopValue); n = stopValue - startValue; } } Stopwatch sw = new Stopwatch(); sw.Start(); delay(1000); sw.Stop(); TimeSpan timeSpan = sw.Elapsed;
double ms = timeSpan.TotalMilliseconds;
|