pc中的时间

来源:互联网 发布:蒙奇奇淘宝旗舰店 编辑:程序博客网 时间:2024/06/05 05:23

//说明:原文和作者不祥。

pc硬件中,有三种基本的获得时间的方法。
1)the “tick” counter。这是个毫秒(千分之一妙)的记时器,可以用temeGetTime()或者GetTickCount()获得。这个记时器是有ISA中断控制器控制的(可能现在被虚拟化为主板上的芯片,而不是原来放在cpu中)。这是一种精度为毫秒的方法。读取它需要一个bus从LPC到ISA接口转换的请求,所以,这种方法有一点慢(大概1-2微秒)。如果当时的bus正处于繁忙中,比如游戏正在使用AGP和DMA处理图形和声音,这种方法可能会经常丢失一段时间,导致延迟。
2)the “performance” counter。这是一种微秒(百万分之一秒)记时器,可以通过调用QueryPerformanceCounter()来读取。这个记时器,每秒触发一百万次多一点,或者是三百万次多一点,取决于bus。它可能是由PCI控制器触发的。读取它,至少要经过cpu-北桥bus转移,但这样并不是很爽快!可能要花一毫妙。
3)the “time stamp” counter.这是cpu内部的一个寄存器,用的是一个64位的记时器,记录的是cpu从开机以来执行的时间,可以记录130年!读取这个值非常的快,它就在cpu内部(读取一次需要40个周期)。这种方法在精确获得一段代码的运行时间时非常有用。

不幸的是,这三种方法,当你想要把他们转换位实际时间,还需要获得cpu时间和秒之间的关系。这在cpu开机运作的时候,就被决定了,使用的其他的记时器。这种方式可能有一些不精确。更糟的是,在笔记本中,这个寄存器的更新频率会在一个较大的范围内波动,因为,此时cpu的速度也在变化。
所以,在精确计算pc的实际时间的时候,没有“银弹”。如果你想要模拟网络上的同步,你就可能不得不将这三种方法结合起来。我在一般情况下使用cycle sounter,因为这样快而且损失小,然后,我通过后两种记时器不断校正这个时间。如果他们的结果不一致,我就丢掉那个采样点,等到迟一些时候再说。这看起来运行得十分不错。

在cpu的速度可以变化的机器上,你可能会很恼火。你可以做的是选择时钟类的另一个实例,并且希望这种跳跃式的时间带来的不精确不会完全破坏掉你到应用程序。

 

原创粉丝点击