社区
界面
帖子详情
在windows下实现纳秒级延时~~~
lixiaosan
2005-08-30 11:08:42
如何在windows下实现纳秒级(ns)的延时~~
...全文
1306
41
打赏
收藏
在windows下实现纳秒级延时~~~
如何在windows下实现纳秒级(ns)的延时~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
41 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
loutingyv
2005-09-02
打赏
举报
回复
学西
sycnick
2005-09-02
打赏
举报
回复
真想不明白
windows下怎么会做ns级的应用呢?
loseme915
2005-09-02
打赏
举报
回复
前一段时间我写过这样的东西,取CPU的运行时间,然后比较。但是在1.5G的CPU上只能精确到3NS左右。
rshu
2005-09-02
打赏
举报
回复
windows只能产生55ms以上精度的时钟,好像侯sir的书上有,要小于这个时间,自己写中断处理程序。
WYJBCB
2005-08-31
打赏
举报
回复
学
皮皮鲁
2005-08-31
打赏
举报
回复
学习
ruodeer
2005-08-31
打赏
举报
回复
mark
legendhui
2005-08-31
打赏
举报
回复
2.系统计时器.
在Windows的SYSTEM.DRV驱动程序中提供了几个鲜为人知的系统计时器函数(这几个函
数未写入Windows.h中,但却被SYSTEM.DRV输出了),这几个函数可以帮助我们获得精
确计时器服务,即系统计时器。这其中最重要的是CreateSystemTimer()和
KillSystemTimer(),这两个函数允许我们安装异步计时器的回调函数(Callback),有
些类似于在DOS环境中截取INT 8中断处理程序。这个回调是真正异步的,完全避开了
Windows的消息工具,因而具有重要意义。事实上,Microsoft Excel和Windows COMM
驱动程序都用到了系统计时器,而由SetTimer()安装的一般计时器也是由系统计时器
来实现的。
这两个函数的原型如下:
WORD CreateSystemTimer(wMsecInterval,lpfnTimerProc);
WORD wMsecInterval; /*以毫秒为单位的时间间隔,系统将每隔此时间调用一 次回调函数
*/
FARPROC lpfn TimerProc;/*指向回调函数的指针*/
WORD KillSystemTimer(hTimer);
WORD hTimer;/*欲释放的系统计时器句柄*/
其中,CreateSystemTimer()用于安装一个系统计时器回调函数,SYSTEM INT8处理程序将
按wMsecInterval指定的时时间间隔调用此回调函数。当然,这个指定的回调频率也是有
限的,同SetTimer()一样,每秒钟调用回调函数次数不能超过18.2次,即wMsecInterval>
55。该函数返回一个系统计时器句柄。若安装失败,则返回NULL。KillSystemTimer()则
用于撤销一个已安装的系统计时器hTimer。若成功,则返回;出错则返回传给它的参数
hTimer。
3.使用系统计时器应注意的问题。
系统计时器回调函数虽然不是中断处理程序,但由于它直接被中断处理程序调用,因此也
必将它看作中断代码。这也就决定了在使用过程中必须注意以下几个问题:
(1).在回函数中应包括尽量少的代码,以使得频繁回调的该函数不至于占用太多的CPU时
间。一般情况下,系统计时器总是用来监视或设置某些变量的值。
(2).由于该回调函数属于中断代码,因此大多数Windows API函数调用都不适用了,只有
几个简单的函数仍然可以使用,如PostMessage(),GetCurrentTask()和MessageBeep()
等。
(3).由于该回调函数由中断处理程序直接调用,因此该函数必须放在一个固定的代码段
中,并且调用前必须装载DS寄存器,这可由形实替换函数MakeProcInstance()来做到。
另外,由于这两个函数在Windows.h中没有给出(即Windows缺省输入库不含此两函数),因
此在调用之前必须进行链接。这可采用运行时动态链接,即通过GetModuleHandle()和
GetProcAddress()来链接;也可在程序模块定义文件中用IMPORTS语句来引入,此时则必
须在程序源文件中说明CreateSystemTimer()和KillSystemTimer()为外部函数。本文给出
的例子采用第二种方案。
legendhui
2005-08-31
打赏
举报
回复
收集的:
1. CreateWaitableTimer,SetWaitableTimer,优点是精确度为100n秒,计时满后调用指定的回调函
数,所以系统占用率非常低,缺点是能够记得最短时间是10毫秒,
2 LARGE_INTEGER lCnt1,lFr,lCnt2;
double f1,f2,fTime;
QueryPerformanceCounter(&lCnt1); //起始记时
。。。。。
QueryPerformanceCounter(&lCnt2);
QueryPerformanceFrequency(&lFr); //得到计数器的频率
f1=lCnt2.QuadPart-lCnt1.QuadPart;
f2=lFr.QuadPart;
fTime=(double)(f1/f2);//fTime就是所用的时间
缺点是:因为是要循环查询方式,所已精确定时时,资源占用达到100%,系统停顿,
3 多媒体计时器
timesetevent
缺点是精确度不高,只有1毫秒,能够记得最短时间也不高,为1毫秒,
4操作8253,缺点是到读写端口,非常麻烦,好像也是循环查询方式,
legendhui
2005-08-31
打赏
举报
回复
在WINDOWS下不可能做出来与机器无关的精确的计时程序。如果用系统提供的计时器(其实是硬件提供--8253计时器),最多只能精确到200毫秒以上(200并不准确)。WINDOWS本身并不能产生即使信号。8253的计时信号适于定义好的,计时器0的频率月为18。2MHz.
thisisll
2005-08-31
打赏
举报
回复
路过学习
lixiaosan
2005-08-31
打赏
举报
回复
呵呵。。。多谢xd们拉。。。继续继续
heidongstar
2005-08-31
打赏
举报
回复
windowns不可能实现纳秒级的延时,换os吧
pomelowu
2005-08-31
打赏
举报
回复
我是黔驴技穷了,帮你up吧
lixiaosan
2005-08-31
打赏
举报
回复
继续
hdqqq
2005-08-30
打赏
举报
回复
以前的水行鸟 老大的回复.
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样:
inline unsigned __int64 GetCycleCount()
{
__asm RDTSC
}
但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:
inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}
以后在需要计数器的场合,可以像使用普通的Win32 API一样,调用两次GetCycleCount函数,比较两个返回值的差,像这样:
unsigned long t;
t = (unsigned long)GetCycleCount();
//Do Something time-intensive ...
t -= (unsigned long)GetCycleCount();
这个方法的优点是高精度。可以直接达到纳秒级的计时精度(在1GHz的CPU上每个时钟周期就是一纳秒)缺点就是在使用前必须了解cpu的频率的准确值
dirdirdir3
2005-08-30
打赏
举报
回复
1G的cpu的一个时钟周期好像就是1ns吧,执行个加法都要几个周期了,只能大概吧。
xx_jj
2005-08-30
打赏
举报
回复
用select函数 你去查msdn
yayafu
2005-08-30
打赏
举报
回复
不可能,调用一个API都要1微秒以上的时间,我的机器是p4 1.5GHz,256M内存的,怎么达到ns啊,你们可以自己测一下
gohappy_1999
2005-08-30
打赏
举报
回复
mark
加载更多回复(21)
高频交易系统编写(
纳秒
级
,多进程,分布式,附基础代码)
高频交易系统编写(
纳秒
级
,多进程,分布式,附基础代码)这是《从编程小白到量化宗师之路》系列的第二个高
级
课程。本课程宗旨是缩短个人和小型结构投资者和大型机构投资者的差距。课程内容从C++环境的安装开始使用,到期货数据采集,完美
实现
一套期货交易高频软件开发(也可做虚拟货币交易),既可以使用C++编写策略又可以通过python编写策略(pybind)。本系统架构设计的特点在最后一章进行了说明,之所以在支持多进程的基础上,又额外支持(跨国,跨省,跨机房)的分布式,是因为有些投资策略有保密的要求,例如:1. 需要把一个策略分摊在多个不同的期货公司(如果交易股票则是多个不同的证券交易所,交易虚拟货币则是多个不同的虚拟交易所),本系统架构都可以完美支持。2 当然,这样的系统架构可以完美提供股票和期货股指的对冲交易策略,因为使用了不同的IP地址,故他人无法通过大数据进行合并逆向推测策略原理。3. 其他需求 课程注重实战,学员上课后,可以达到:日常进行的高频交易,自定添加新的股票接口,添加新的虚拟货币交易所。
[转]
windows
下
实现
微秒
级
的
延时
1.微秒
级
的
延时
肯定不能基于消息(SetTimer函数),因为一出现消息堵塞等就会影响精 度,而且setTimer单位才是毫秒.实际响应时间可能要到55毫秒左右. 2.微秒
级
的
延时
也不能基于中断,VxD最快的时钟服务程序Set_Global_...
c/c++使用chrono库函数
实现
纳秒
级
计时
//返回运行时间 } 注意事项: 使用
纳秒
级
计时必须使用high_resolution_clock,nanoseconds *1000000000是为了去掉小数,你自己可以决定要不要乘这个数或者其他数 参考文章: C++11 新的计时方法——std::chrono 大法...
windows
下
实现
微秒
级
的
延时
windows
下
实现
微秒
级
的
延时
2010年11月17日 1.微秒
级
的
延时
肯定不能基于消息(SetTimer函数),因为一出现消息堵塞等就会影响精 度,而且setTimer单位才是毫秒.实际响应时间可能要到55毫秒左右. 2.微秒
级
的...
C语言
纳秒
级
计时
C语言中常用的clock()函数只能精确到毫秒
级
,对应的数据类型是clock_t。 C11标准中提供了
纳秒
级
别定时器:timespec_get()函数与timespec()类型。
界面
15,979
社区成员
115,897
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章