问题描述
工程中精确定时很重要。我尝试利用Win32API函数QueryPerformanceCounter和QueryPerformanceFrequency实现微妙级计时。原理就是Counter函数返回一段代码运行后电脑计数器的计数值;Frequency返回计数器的频率——两者相除得到时间。但是问题:我发现误差特别大,比如执行:longfreq=QueryPerformanceFrequency(...);longa=QueryPerformanceCounter(...);Thread.Sleep(2000);longb=QueryPerformanceCounter(...);longtime=(a-b)/freq;得到的time结果几乎与2秒无关。不知是否是因为中间编译的问题呢?请各位老师指教
解决方案
解决方案二:
[DllImport("kernel32.dll")]externstaticshortQueryPerformanceCounter(reflongx);[DllImport("kernel32.dll")]externstaticshortQueryPerformanceFrequency(reflongx);publicvoiddelay(longdelay_Time){longstop_Value=0;longstart_Value=0;longfreq=0;longn=0;QueryPerformanceFrequency(reffreq);longcount=delay_Time*freq/1000;QueryPerformanceCounter(refstart_Value);while(n<count){QueryPerformanceCounter(refstop_Value);n=stop_Value-start_Value;}
解决方案三:
Stopwatch类已经封装好了这两个api,直接用它更方便。Thread.Sleep本来误差就很大,不是能够用来精确定时的。
解决方案四:
@子夜__我先试一下精度大神~
解决方案五:
@winnowc但好像stopwatch不能实现微秒级定时吧?是这样的吗
解决方案六:
根本不需要调用这些函数,Stopwatch中已经封装了,是百纳秒级的
解决方案七:
引用5楼bigbaldy的回复:
根本不需要调用这些函数,Stopwatch中已经封装了,是百纳秒级的
那这个精度能保证吗
解决方案八:
引用6楼songsun12的回复:
Quote: 引用5楼bigbaldy的回复:
根本不需要调用这些函数,Stopwatch中已经封装了,是百纳秒级的那这个精度能保证吗
它能保证精度,但是windows系统的CPU时间片是13毫秒左右,如果你计时的时候正好赶上CPU进程切换,那么就会有误差,这个无法避免