【发布时间】:2016-02-27 05:15:05
【问题描述】:
我正在编写以下 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
我的错误是什么?另外,我想问一下使用这样的程序可以获得的最高精度是多少?
非常感谢!
【问题讨论】:
-
编辑后的代码不是改进。值 INT_MAX 超出了
tv_usec组件的允许值范围(有效范围为 0..999999 微秒),因此出现错误。 -
谢谢!但是,无论我的循环有多大或多小,最后我都会得到 0。