2010-09-24 45 views
4

我正试图在Redhat Linux上优化我们的gettimeofday()系统调用。 通过他们的文档,它可以通过使用虚拟动态共享对象(VDSO)在用户区域运行呼叫来加快速度。我很好奇,我怎样才能确定电话的速度呢?我想做出改变,然后比较对我的以前的结果测量系统调用速度

+0

我不知道如何系统调用在用户空间中运行,或有什么可以做,以充分优化吗......?我的理解是,VDSO只是让内核可以公开在当前处理器上运行系统调用的首选方式(使用'int 80h'或'sysenter' /'syscall'),并跟踪其他一些内务处理细节。 – Doug 2010-09-24 13:32:19

+0

在glibc运行时库中实现了一个虚拟动态共享对象(VDSO)。 VDSO映射一些内核代码,这是读取用户空间中的gettimeofday所必需的。标准红帽企业版Linux 5.1允许gettimeofday函数完全在用户空间中执行 ,消除系统调用开销。 – Ananymous 2010-09-24 13:34:52

+0

谢谢,这绝对有趣 - 我想到了这种可能性,但没有意识到它实际上已经完成。似乎内核在发生上下文切换时将处理器的时间戳记计数器(RDTSC)和时间存储在VDSO页面中,这使得glibc可以计算一天中的时间,而无需实际进行系统调用。 – Doug 2010-09-24 13:44:07

回答

6

伪代码:

  1. 呼叫gettimeofday()和保存导致a
  2. 呼叫gettimeofday()一百万次
  3. 呼叫gettimeofday()并保存结果在b
  4. 计算(b-a)/1,000,000

原理:对gettimeofday()的两个边界调用不应对循环产生太大影响。调用你想要的功能可能会感觉很奇怪,但没关系。

+1

+1常识胜。 – 2010-09-24 13:53:17

1

如果您在英特尔平台IAPerf.H上有一些宏,可以使高分辨率的计时变得简单明了。

PERFINITMHZ(1200) // Set the clockspeed of your processor 
    PERFSTART 
    gettimeofday(); 
    PERFSTOP 
    PERFREPORT 

它使用Time Stamp Register所以你避免SYS通话费用,以获得时间并获得精确的时序。如果结果不够充分,您可能仍然希望调用gettimeofday一百万次,并将结果分开。