在linux上快速流逝的时间

时间:2009-09-04 16:01:04

标签: c linux time

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

我考虑过使用jiffies,但是在用户空间不可用。那么,我应该使用getimeofday()还是有任何最快的方法来做到这一点。

我只对两次通话之间的缩短时间感兴趣,可以在基准测试工具中使用。

7 个答案:

答案 0 :(得分:9)

查看clock_gettime,它可以访问高分辨率的计时器。

答案 1 :(得分:9)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

如果您使用的是x86 / x64架构,并且您在单个CPU上运行,则可以考虑在CPU上读取时间戳计数器以获得循环计数。维基百科有more information。请注意,如果您的应用程序在多个CPU上运行,则此方法不太有用,因为每个CPU都有自己的TSC。如果您决定要转换周期,请注意频率缩放 - >时间单位。

答案 4 :(得分:1)

如果您的内核支持gettimeofday()作为vsyscall(虚拟系统调用),那么使用它将比调用常规系统调用(如clock())更快。有关vsyscalls如何工作的一些信息,请参阅Andrea Arcangeli's presentation

答案 5 :(得分:0)

有点迟到,但是任何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

答案 6 :(得分:0)

以下适用于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