这个函数对我来说很新,所以我只写了一个小程序来熟悉它。这是我的一个程序(只是在几次gettimeofday调用之间打印圈数(。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>
typedef struct timeval t_timeval;
t_timeval get_diff(t_timeval prev)
{
t_timeval current_time;
gettimeofday(¤t_time, NULL);
printf("diff : %ld seconds and %ld micro secondsn",
current_time.tv_sec - prev.tv_sec, current_time.tv_usec - prev.tv_usec);
return (current_time);
}
int get_time_laps()
{
int i = 0;
t_timeval prev;
gettimeofday(&prev, NULL);
while (i++ < 50)
prev = get_diff(prev);
return (0);
}
int main()
{
get_time_laps();
return (0);
}
结果是:
diff : 0 seconds and 0 microseconds
diff : 0 seconds and 47 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 2 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 1 microseconds
diff : 0 seconds and 0 microseconds
[...]
diff : 0 seconds and 1 microseconds
所以我想知道为什么第二个差异与其他差异如此不同。。仅供参考,我做了几次测试,每次我都得到这个模式。
发生这种情况的原因非常有趣。由于gettimeofday将使用一个经常调用的系统调用,linux使用一个事物调用vdso,这是一个在程序中自动映射的so,以便在不需要系统调用的情况下访问与时间信息相关的事物(因为系统调用代价高昂(。
其工作方式是,当您调用gettimeofday时,您的程序将在vdso中查找符号。当它找到它时,我会将它缓存在它的内存中,以便更快地访问。这就是为什么第一次通话速度较慢的原因。你可以在这里找到更好的解释
通常C库会使用第一次调用,然后缓存结果以备后续调用。
还有一种很好的方法,可以将vdso与实际的系统调用进行比较