50 likes | 204 Views
高精度计时. TimeGetTime 多媒体计时器,它可以提供毫秒级的计时 QueryPerformanceCount 计数器,随系统的不同可以提供微秒级的计数 Pentium CPU 内部时间戳进行计时的高精度计时 . APIC 的机器上,修改 8254 的定时间隔,截获 8254 的中断. QueryPerformanceCount 计数器. 对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用 QueryPerformanceCount/QueryPerformanceFrequency 是一项基本功。. Pentium CPU 内部时间戳.
E N D
高精度计时 TimeGetTime多媒体计时器,它可以提供毫秒级的计时 QueryPerformanceCount计数器,随系统的不同可以提供微秒级的计数 Pentium CPU内部时间戳进行计时的高精度计时. APIC的机器上,修改8254的定时间隔,截获8254的中断
QueryPerformanceCount计数器 • 对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。
Pentium CPU内部时间戳 • Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。 • 机器指令RDTSC读取这个时间戳的数字 • 可以达到纳秒级的计时精度
Pentium CPU内部时间戳 • 优点: • 1.高精度。可以直接达到纳秒级的计时精度(在1GHz的CPU上每个时钟周期就是一纳秒),这是其他计时方法所难以企及的。 • 2.成本低。timeGetTime 函数需要链接多媒体库winmm.lib,QueryPerformance* 函数根据MSDN的说明,需要硬件的支持,但RDTSC指令是一条CPU指令,凡是i386平台下Pentium以上的机器均支持,甚至没有平台的限制而且函数调用的开销是最小的。 • 3.具有和CPU主频直接对应的速率关系。一个计数相当于1/(CPU主频Hz数)秒,这样只要知道了CPU的主频,可以直接计算出时间。这和QueryPerformanceCount不同,后者需要通过QueryPerformanceFrequency获取当前计数器每秒的计数次数才能换算成时间。 • 缺点: • 1.现有的C/C++编译器多数不直接支持使用RDTSC指令,需要用直接嵌入机器码的方式编程,比较麻烦。 • 2.数据抖动比较厉害。其实对任何计量手段而言,精度和稳定性永远是一对矛盾。如果用低精度的timeGetTime来计时,基本上每次计时的结果都是相同的;而RDTSC指令每次结果都不一样,经常有几百甚至上千的差距。这是这种方法高精度本身固有的矛盾。 • 和CPU相关,移植性差。
APIC的机器上修改8254的定时间隔 • 在基于APIC的计算机上,8254根本没有用着,系统不是用它来实现多任务调度的,不会导致会导致依赖于它的系统时钟发生混乱。 • 现在PCI总线的机器基本上都采用了APIC,因为APIC支持多处理器系统 • 在基于APIC-HAL的Windows 2000系统中,系统时钟的中断向量为0D1H,在单处理器系统中,这是正常情况下最高的中断优先级了,你必须设法使得8254的中断优先级高于它才行,否则精度难以保证。