在.net中大家有没有用过QueryPerformanceCounter和QueryPerformanceFrequency函数

问题描述

工程中精确定时很重要。我尝试利用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进程切换,那么就会有误差,这个无法避免

时间: 2024-09-09 18:55:15

在.net中大家有没有用过QueryPerformanceCounter和QueryPerformanceFrequency函数的相关文章

myeclipse中修改代码没有用?

问题描述 myeclipse中修改代码没有用? 我是新手,现在练习web中的servlet,出错之后,修改代码,没有用处,什么重启tomcat没用,网上试了好几个办法,么用.只有我重新启动myeclipse重新运行才行,可是每次这样好麻烦!!求大神解答!!我qq773065280,可以帮我远程调试也行!!真心感谢!! 解决方案 我有遇到过,后来把MyEclipse重装了一下,就好了 解决方案二: 解决方案三: 解决方案四: 换个其他的Myeclipse吧,这个是非常规问题,clean了应该是全部

jsp ajax d...-ajax拼接的字符串中引用样式没有用

问题描述 ajax拼接的字符串中引用样式没有用 zoombox是一个可以调用模态窗口的样式,在本页面可以调用模态窗体,用ajax就直接跳转页面了.求大牛解决我这个问题 解决方案 如果是连接,要注意onclick中return false阻止连接跳转 <a href="xxx" onclick="zoombox(...);return false;">xxxx</a>

Asp.net中固定位数用零补齐的函数

Asp.net中固定位数用零补齐的函数(已解决,示例)! 在开发当中,出现编号实现8位数,但需要用0补齐.如:123,表示:0000123. 实例如下: decimal aaa = 123; // 数值型 string bbb = aaa.ToString(); // 转换为字符 bbb = bbb.PadLeft(7, '0'); // 共7位,之前用0补齐 response.write(bbb ); decimal aaa = 123;    // 数值型 string bbb =  aaa

支持中文和其他编码的php截取字符串函数分享

 这篇文章主要介绍了支持中文和其他编码的php截取字符串函数示例(截取中文字符串),需要的朋友可以参考下 简单的字符串截取方法,支持中文和其他编码,传入相对应的参数直接调用就可以了  代码如下: /**  * 字符串截取,支持中文和其他编码  * @static  * @access public  * @param string $str 需要转换的字符串  * @param string $start 开始位置  * @param string $length 截取长度  * @param

中断-stm32中可以定义2个一样名字的函数吗,比如另个NVIC_Configuration()

问题描述 stm32中可以定义2个一样名字的函数吗,比如另个NVIC_Configuration() 我现在看到的一个程序里面他一共定义了2个这个函数,一个是在main函数所在的源文件中,另一个里面的他前面加了static,加static的那个函数是不是只在那个源文件中才能被调用,而且是从定义它的地方开始,? 我可以2个都加static吗?这个函数设计到外设的优先级,定义2个函数,如果他们的优先级设置是一样的,主优先级和此优先级都是0,那么如果他们同时中断会不会有问题 解决方案 对,static

c++在函数中new的对象数组如何在主函数中使用

问题描述 c++在函数中new的对象数组如何在主函数中使用 Student *p; int main(){ read(); p[0].getname(); //这一行去掉正常运行,写在read()里也正常 delete[] p; return 0; } int read(){ int n; string str; ifstream fin("k.txt"); fin>>n; p=new Student[n]; for(int i=0;i { fin>>str&g

link中可以调用abstrac中的静态函数,能不能把成员函数当成静态函数?

问题描述 link中可以调用abstrac中的静态函数,能不能把成员函数当成静态函数? link中可以调用abstrac中的静态函数,能不能把成员函数当成静态函数? 解决方案 除非你能hack clr(微软听说要开源了),获取能办到. 解决方案二: 成员函数怎会是静态函数,他俩不能划等号

在qt5中使用QListView用了一个双击槽函数QModelIndex index类型参数问题

问题描述 在qt5中使用QListView用了一个双击槽函数QModelIndex index类型参数问题 在qt5中使用QListView用了一个双击槽函数 on_listView_doubleClicked(QModelIndex index) 会传递一个参数QModelIndex index.我现在的问题是我想在其他地方也触发这个槽函数,我就是不知道怎么给QModelIndex类型参数赋值. 自己研究很长时间了,如果那位大神知道,请指教. 谢谢... 解决方案 昨天自己弄出来了.可以在别的

嵌入式-c中的宏定义可以是2个函数吗,我把别人的函数移到自己文件中,但是有些同样功能的函数名字不一样

问题描述 c中的宏定义可以是2个函数吗,我把别人的函数移到自己文件中,但是有些同样功能的函数名字不一样 还要后面的括号以及内部的形参吗? 解决方案 你的提问: delay_us()是我从别的文件中copy过来的,只有函数名,并没有这个函数的定义,如果我用#define f1() f2()的形式,应该是替换了整个函数吧,程序中没有定义能行吗?我的意思就是吧f1替换成f2,那么#define f1 f2,这样对f1(),f2()函数会起作用吗. 我的理解: 代码中 没有f1 函数的实现 ,但是有 函