我正在编写以下 C 代码,以获取使用 getitimer 和 setitimer 执行简单操作所花费的时间。
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#define INTERVAL 1 /* number of milliseconds to go off */
int main() {
double sum = 0;
struct itimerval initial, updated;
initial.it_value.tv_sec = INTERVAL;
initial.it_value.tv_usec = 999999;
initial.it_interval = initial.it_value;
memcpy(&(initial.it_interval), &(initial.it_value), sizeof( initial.it_value ));
printf("%ld\n", initial.it_value.tv_usec);
if (setitimer(ITIMER_VIRTUAL, &initial, NULL) == -1) {
perror("error calling setitimer()");
exit(1);
}
for (unsigned int i; i < 100; i++)
sum += 1./i;
if (getitimer(ITIMER_REAL, &updated) == -1) {
perror("error calling getitimer()");
exit(1);
}
printf("Time started = %ld\n; Time ended = %ld\n: Time taken = %ld\n",
initial.it_value.tv_usec, updated.it_value.tv_usec,
initial.it_value.tv_usec - updated.it_value.tv_usec);
return 0;
}
我编译了:
$ gcc -o timer -std=c99 -Wall -pedantic getitimer.c -lrt -03
但是,我的答案始终是 999999(我增加和减少了 100):
./timer
999999
Time started = 999999
; Time endd = 0
: Time taken = 999999
我的错误是什么?另外,我想问一下使用这样的程序可以获得的最高精度是多少?
非常感谢!
我看到的主要是除法运算使用整数除法。所以:
initial.it_value.tv_sec = INTERVAL/1000000;
在 tv.sec 中放置 0
initial.it_value.tv_usec = (INTERVAL/1000000) * 1000000;
将 0 放入 tv_usec
initial.it_interval = initial.it_value;
一般来说,在分配多字段结构时,使用memcpy()
而不是直接分配。 (直接赋值适用于初始化但不适用于赋值。)
因此,发布的代码将“间隔”设置为 0
所以当然,结果值为0
这是 setitimer() 和 getitimer() 手册页中的关键语句
“定时器从 it_value 递减到零,产生一个信号,并重置为 它_间隔。设置为零的计时器(it_value 为零或计时器到期且 it_interval 为零)停止。”
建议:已编辑
initial.it_value.tv_set = INTERVAL;
initial.it_value.tv_usec = 0;
memcpy( &(initial.it_interval), &(initial.it_value), sizeof( initial.it_value ) );
...
我是一名优秀的程序员,十分优秀!