系统调用速度的测量

4

我正在尝试优化我们在Redhat Linux上的gettimeofday()系统调用。根据他们的文档,可以通过在用户空间中使用虚拟动态共享对象(VDSO)运行调用来加速它。我想知道如何首先测量调用的速度?我想进行更改,然后将其与以前的结果进行比较。


我不明白系统调用如何在用户空间中运行,或者你可以做什么来实现大规模优化。我的理解是,VDSO只是为了让内核能够在当前处理器上公开运行系统调用的首选方式(使用“int 80h”或“sysenter/syscall”),并跟踪其他一些管理细节。 - Doug
glibc运行库实现了一个虚拟动态共享对象(VDSO)。VDSO映射了一些内核代码,这对于在用户空间中读取gettimeofday是必要的。标准的Red Hat Enterprise Linux 5.1允许完全在用户空间中执行gettimeofday函数,消除了系统调用开销。 - Ananymous
谢谢,这确实很有趣 - 我曾考虑过这种可能性,但并没有意识到它实际上已经被实现了。当发生上下文切换时,内核似乎会将处理器的时间戳计数器(RDTSC)和当天的时间存储在VDSO页面中,这使得glibc可以计算出当天的时间而无需进行系统调用。 - Doug
3个回答

7

伪代码:

  1. 调用gettimeofday()并将结果保存在a
  2. 调用gettimeofday()一百万次
  3. 调用gettimeofday()并将结果保存在b
  4. 计算(b-a)/1,000,000

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


3
也许
strace -T

1
如果您使用的是英特尔平台,IAPerf.H 中有一些宏可以使高分辨率计时变得简单。
   PERFINITMHZ(1200) // Set the clockspeed of your processor
   PERFSTART
   gettimeofday();
   PERFSTOP
   PERFREPORT

它使用时间戳寄存器来获取时间,因此您可以避免系统调用的成本并获得准确的计时。如果结果不够准确,您仍然可能想要调用gettimeofday一百万次并除以结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接