在linux开发版最长问到的问题之一就是在linux下如何得到更精确的计时。其实有很多办法,比如以前就有人用select。不过现在有更精确的实时时钟可以用,这就是用CLOCK_PROCESS_CPUTIME_ID做参数通过timer_create来创建timer。通过clock_getres可以得到系统的精度。
实际上,上述方法底层用的就是CPU的rdtsc指令。 在linux下,可以用到CPU的rdtsc指令(当然,windows下也是这样。现在的CPU一般都支持这个指令)来得到一个CPU的时间戳(Time Stamp),这个值是每个指令周期都增加的,再根据CPU的频率就可以计算出时间来。用这种方式,对于频率高的CPU,甚至可以实现纳秒级的时间控制。不过据说因为精度太高,这种方式数据抖动比较厉害,每次结果都不一样,经常有几百甚至上千的差距。不过在我的实验中误差并没有这么大,上下在1%左右,不过如果你的要求高的话,这1%也是很厉害的。不过sleep调用也是会有误差的,这里就不去研究了。
下面是源码:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
我的实验环境:Intel E6320/2G,使用VMWare虚拟机,系统是centos5-x86。下面是输出结果。
t2 - t1 = 1865320163 (1865MHZ)
t2 - t1 = 1865996702 (1865MHZ)
t2 - t1 = 1862758710 (1862MHZ)
t2 - t1 = 1865247214 (1865MHZ)
t2 - t1 = 1863456686 (1863MHZ)
t2 - t1 = 1865427930 (1865MHZ)
t2 - t1 = 1865423429 (1865MHZ)
t2 - t1 = 1863616999 (1863MHZ)
t2 - t1 = 1865105795 (1865MHZ)
t2 - t1 = 1867224090 (1867MHZ)