我正在寻找一种快速的方法来获取C中两次函数调用之间的经过时间。
我考虑过使用jiffies,但是在用户空间不可用。那么,我应该使用getimeofday()还是有任何最快的方法来做到这一点。
我只对两次通话之间的缩短时间感兴趣,可以在基准测试工具中使用。
答案 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