在Linux上快速stream逝的时间

我正在寻找一种快速的方法来获取C中函数的两次调用之间的时间间隔

我考虑过使用jiffies,但是它们在用户空间中不可用。 所以,我应该使用getimeofday()还是有最快的方法来做到这一点。

我只对两次调用之间的时间间隔感兴趣,以便在基准工具中使用。

我会从time.h通过clock()得到处理器时间。 要获得有用的值,请通过CLOCKS_PER_SEC转换为毫秒:

 clock_t start = clock(); // [...] clock_t end = clock(); unsigned long millis = (end - start) * 1000 / CLOCKS_PER_SEC; 

看看clock_gettime ,它提供了对高分辨率定时器的访问。

是的,如果你想找到实际的经过时间,gettimeofday()就足够了。 如果您需要查找CPU时间,则可以使用clock()。 在很多情况下,两种方法都会得到相似的结果(除非有睡眠或代码等待)。 clock()的例子可以在这里找到:
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html

如果您使用的是x86 / x64架构,并且运行在单个CPU上,则可以考虑读取CPU上的时间戳计数器以获取周期数。 维基百科有更多的信息 。 请注意,如果您的应用程序在多个CPU上运行,则此方法的用处不大,因为每个CPU都有自己的TSC。 如果您决定要转换周期 – >时间单位,也要小心频率调整。

如果您的内核支持gettimeofday()作为vsyscall(虚拟系统调用),那么使用它将比调用诸如clock()的常规系统调用更快。 请参阅Andrea Arcangeli的介绍 ,了解vsyscalls的工作原理。

最近的一点,但是任何linux / unix上可用的时间可能都是实现你想要的更轻量级的方式。 这里有两个例子

 time ls -l stuff* ls: stuff*: No such file or directory 0.01s real 0.00s user 0.00s system time -c run_script.csh` ... real 1m22.38s user 0m14.67s sys 0m1.06s 

以下为我在CentOS 6上的作品:

 #include <stdio.h> #include <stdlib.h> #include <time.h> #if ! defined(_POSIX_C_SOURCE) # error "_POSIX_C_SOURCE undefined" #endif #if _POSIX_C_SOURCE < 199309L # error "_POSIX_C_SOURCE < 199309L" #endif int main(int, char**){ struct timespec start, stop; struct timespec stop; if(clock_gettime(CLOCK_MONOTONIC, &start )) goto err_out; if(clock_gettime(CLOCK_MONOTONIC, &stop )) goto err_out; printf("start == {tv_sec: %d, tv_nsec: %d}\n", start.tv_sec, start.tv_nsec); printf("stop == {tv_sec: %d, tv_nsec: %d}\n", stop.tv_sec, stop.tv_nsec ); printf("stop.tv_nsec - start.tv_nsec == %d\n", stop.tv_nsec - start.tv_nsec); return EXIT_SUCCESS; err_out: perror("clock_gettime"); return EXIT_FAILURE ; } 

…虽然它确实需要librt

 $ make dur cc dur.c -o dur /tmp/cc1yF58x.o: In function `main': dur.c:(.text+0x1c): undefined reference to `clock_gettime' dur.c:(.text+0x4e): undefined reference to `clock_gettime' collect2: ld returned 1 exit status make: *** [dur] Error 1 $ LDFLAGS="-lrt" make dur cc -lrt dur.c -o dur $ ./dur start == {tv_sec: 206247, tv_nsec: 411717209} stop == {tv_sec: 206247, tv_nsec: 411759791} stop.tv_nsec - start.tv_nsec == 42582