两种软硬件的时间的计算方法
在性能领域中,时间的精确计算是非常重要的unix系统时间,最直接的就是延迟的测量。几乎所有的benchmark工具都涉及到时间的计算问题。那么如何得到精确的时间呢,Denis Bakhalov在他的著作"Performanceanalysis and tuning on modern CPU“中有提到分别有基于硬件和软件的2种方式。今天就来讲一下这两种时间计算的区别。 1 软件方式 软件方式叫做:System-wide high-resolution time。 这个时间也叫系统时间,是基于一个给定的起始时间(epoch),在这个起始时间上进行增加。例如在Unix系统里面,epoch就是1970年的00:00:00时开始。这也是为啥数据库系统在记录当前日期的空值或者异常值选择1970 00:00:00的原因。系统时间的增加的单位是纳秒(nano-seconds)。 系统时间适用于测量微秒(microsecond)以上的时间精度,在所有CPU上是保持一致性的,并且和CPU的频率是无关的。在OS中可以通过system call来获取系统时间。 但如果要获取更高精度的时间,那么就需要调用一些特殊的函数,以Linux为例可以调用clock_gettime函数。另外,还可以用ptherad_getcpuclockid函数来从不同的thread获取CPU的时间。 本书中也给出了一个C++的计时例子如下所示: 示例代码引用了chrono类,分别获取一个开始和结束时间,并计算时间差值。 2 硬件方式 硬件方式叫做:Time Stamp Counter(TSC),这种方式以硬件为基础实现的。 TSC所不同的是每个CPU拥有自己的TSC, 但也同样不用考虑CPU的频率问题,其计算是CPU所消耗的参考周期(reference cycle)的数量。TSC适用于测量纳秒或者更高精度以上的消耗时间。 这里补充说明:reference cycle(也叫external clock)并不是core的clock cycles。clock cycles的计算是根据clock frequency得出的,如下图所示两者结果的不同。 以下代码示例给出了编译器内置的RDTSC汇编指令以获取TSC时间。 3 如何选择? 选择哪种时间计算的方式取决于需要测量的精度,TSC可以给到更加精确的时间精度(比如需要精确到cycle级别),但如果应用程序的执行是以小时为基本单位,那么完全没有必要使用TSC,使用系统时间就可以了 另一个需要注意的是,系统时间通常比TSC有更高的延迟。而使用clock_gettime的方法可以比RDTSC指令慢10倍,通常需要达到20个CPU cycles。 总结:本文总结了2种时间获取和计算的方法,分别是软件和硬件的方式。了解这些方式的差异有助于在应用中实现更精确的时间测量。 (编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |