对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。
在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerformanceCount计数器,随系统的不同可以提供微秒级的计数。对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。
(引用)- -
我们可以在C++中这样写:
__declspec (naked) unsigned __int64 GetCpuCycle( void )
{
_asm
{
rdtsc
ret
}
}
RDTSC的返回值存放在EDX EAX中, EDX为高32位,EAX为低32位。。。
这里的__declspec (naked)就不用说了吧。。前面已经提到过。 关键是这里的 RDTSC 指令( Read Time Stamp Counter), 获得CPU的高精度时间戳。也可以这样写:
__declspec (naked) unsigned __int64 GetCpuCycle( void )
{
_asm
{
__asm_emit 0x0F
__asm_emit 0x31
ret
}
}
这样相当于直接压入该指令的机器码。原贴说rdtsc不能在C++内联汇编编译器里面被识别。反正我是可以的,不知道是不是现在编译器能识别这个的原因,这里不讨论这个 - -
这样以来我们就可以在随处获得当前的CPU自上电以来的时间周期数了:
unsigned __int64 iCpuCycle = GetCpuCycle();
根据这个数字我们可以计算出上电以来所经历的时间( 秒s):
second = iCpuCycle / CPU主频率( HZ);
1GHZ = 1,000 MHZ = 1,000,000 KHZ= 1,000,000,000 HZ;
完全可以放心一个unsigned __int64 不会溢出 - - 你可以计算一下你的CPU能保存多少年的时间。。
根据这一方法有几个好处: 一是精度高,二是函数调用开销最小,三是平台限制小,四是具有和CPU主频相对应的直接关系。。。 但是由于精度高,得到的数字浮动比较大。。
有了这样一个计时器,一些实时的处理就更精准了。。。。 - -
分享到:
相关推荐
西门子SIMATIC过程控制系统PCS 7高精度时间戳pdf,西门子SIMATIC过程控制系统PCS 7高精度时间戳:本文档完整地概述了与使用高精度时间戳相关的以下主题,包括实现SOE所需的软硬件及如何组态.
鉴于之前部分网友反映我上传的一个C++纳秒计时器压缩文件损坏,我这次重传,直接上传的是源代码截图(有10行不到),可以通过修改其中的参数来达到识别精度的目的(原理主用利用CPU晶振这一特性)
SIMATIC 过程控制系统 PCS 7 高精度时间戳 (V8.1)zip,“SIMATIC 过程控制系统 PCS 7 高精度时间戳”手册概述了与使用高精度时间戳相关的内容:所需组件,组件组态
SIMATIC 过程控制系统 PCS 7 高精度时间戳 (V8.2)[手册]pdf,
C#写的 C,C++语言的数据类型转换;C的时间戳转换工具
基于FPGA的高精度IEEE1588时间戳的设计与实现.pdf
根据RTSP流中RTP时间戳,以及RTCP中的信息,计算精确播放时间,以及音频视频时间差。
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以...
自己做的各类数组的测试,用于测试时间戳与日期的转换
VC++进行高精度计时 VC++进行高精度计时
主要介绍了C++ 中时间与时间戳的转换实例详解的相关资料,需要的朋友可以参考下
c++实现的日期时间转时间戳,时间戳转日期时间:(win32控制台小程序) 例如如下例子: timeStamp: 1325347200; time: 2012-01-01 00:00:00 timeStamp: 1538409599; time: 2018-10-01 23:59:59 timeStamp: 888645574...
获取CPU精确时间,微秒级别SetThreadAffinityMask and QueryPerformanceFrequency
完整的时间、日期、时间戳和时区操作类库。
字符串和时间戳相互转换
科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳科学计数法转换时间戳...
c++项目日志打印,方便调试,使用简单方便,使用时应用log4z.h即可
首先,我们来思考一个问题,在三菱PLC中,你如何计算昨天的某个时间点,到现在为止过了多少秒? 可能有人会说,这个简单,我搞一个计数器,1秒增加1,不就完事了? 那么,如果中途断了几十分钟电呢? 有人可能...
通过sysTimestampFreq()函数可以得到系统时间戳的频率,它往往反映的是CPU定时器的基准频率。当然,如此高的分辨率只能是一个理想值,不同的系统不一定都能实现。毕竟该时间戳的实现方式有一个致命的弱点:通过查询...