用rdrtc实现linux下的精确计时
来源:互联网 发布:网络招聘文员是干嘛的 编辑:程序博客网 时间:2024/06/02 14:45
在 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调用也是会有误差的,这里就不去研究了。
下面是源码:
int get_rdtsc() {
asm("rdtsc");
}
int main() {
int i;
for(i=0;i<10;i++) {
int t1 = get_rdtsc();
sleep(1);
int t2 = get_rdtsc();
printf("t2 - t1 = %ld (%ldMHZ) ", t2 - t1, (t2-t1)/1000000);
}
}
我的实验环境: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)
- 用rdrtc实现linux下的精确计时
- 用rdrtc实现linux下的精确计时
- 用rdtsc实现linux下的精确计时
- linux精确到微妙的计时简单实现
- windows下的精确计时函数
- 如何实现程序的精确计时
- c++实现精确计时
- Linux下的计时
- LINUX下使用简单的中断程序使单片机精确计时
- J2ME实现精确秒表计时
- Windows下用C/C++精确到微秒的计时方法
- Windows下获得精确计时的方法[微秒级]
- Windows下获得精确计时的方法[微秒级]
- 使用clock函数实现跨平台的精确计时
- linux中c语言精确计时函数的使用
- Linux系统下的51单片机数码管实现精准计时
- Linux下的计时函数
- Linux下Shell的计时
- weblogic域内存增加方法
- Hibernate中Criteria的完整用法
- 将服务器的SQL数据库备份或导入到本地
- javamail 解析 显示正文详细思想
- java.lang.OutOfMemoryError: Java heap space异常
- 用rdrtc实现linux下的精确计时
- 关于linux下的随机数
- Data Access Application Block 中事务的使用
- 日记 08.4.8
- firefox,你什么时候让我和IE永远说再见?
- 对于数据库防注入的解决办法
- .net remoting 基础一、Remoting基础
- Oracle数据库中索引的维护 - 服务器专区 | IT168
- vc 进程间通讯