测量成本的工具
使用 gettimeofday()
这个典型时钟函数来测量时间成本,返回自1970-01-01 00:00:00到现在所经历的秒数,调用两次该函数通过相减的方式获取时间差。
根据函数的定义:此函数在sys/time.h>
中
1
| int gettimeofday(struct timeval *, struct timezone *);
|
定义了两个结构体,分别记录时间和时区
1 2 3 4 5 6 7 8 9
| struct timeval {undefined time_t tv_sec; suseconds_t tv_usec; };
struct timezone {undefined int tz_minuteswest; int tz_dsttime; };
|
使用举例 : 测试其时间精度是否可以达到定义中声明的微秒级别
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int main() { struct timeval start,end; int i = 10; gettimeofday(&start, NULL); for(i=0;i<10;++i) { gettimeofday(&start, NULL); gettimeofday(&end, NULL); printf("%ld\n", end.tv_usec - start.tv_usec); printf("%ld %ld\n", end.tv_usec, start.tv_usec); } gettimeofday(&end, NULL); return 0; }
|
这是在空系统调用测试中连续调用 gettimeofday()
函数,如果精确度可以达到微秒 级别,那么两次连续调用获取的时间相减应该近似于0
执行结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 0 157238 157238 0 157275 157275 0 157278 157278 1 157282 157281 0 157285 157285 0 157288 157288 0 157291 157291 1 157295 157294 0 157298 157298 0 157301 157301
|
基本可以确定在微秒级别
注意
一般情况下,系统调用的时间成本是在 ns
的级别,所以即使可以达到微秒级别,也要通过多次测量取平均值的办法才可以尽可能的实现准确。
测量系统调用的时间成本
这里使用简单的 read()
函数来测量调用的成本 , 测试程序的代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <stdio.h> #include <sys/time.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h>
int main() { int n = 10; while (n--) { int fd = open("./6.2.c", O_RDONLY); int i; char buf[10]; struct timeval start, end; if (fd == -1) { fprintf(stderr, "file open failed!\n"); exit(1); } gettimeofday(&start, NULL); for (i = 0; i < 10000; ++i) { read(fd, buf, 0); } gettimeofday(&end, NULL); printf("%d :万次的平均结果: %lf\n", 10 - n, (1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec) * 1.0 / 10000); close(fd); } return 0; }
|
测试程序的结果如下
1 2 3 4 5 6 7 8 9 10
| 1 :万次的平均结果: 0.583100 2 :万次的平均结果: 0.598400 3 :万次的平均结果: 0.594100 4 :万次的平均结果: 0.595600 5 :万次的平均结果: 0.601000 6 :万次的平均结果: 0.615700 7 :万次的平均结果: 0.606900 8 :万次的平均结果: 0.589100 9 :万次的平均结果: 0.595500 10 :万次的平均结果: 0.584900
|
从多次运行万次平均结果看,对于 read
函数,系统调用的时间约为 0. 6 微秒。