我正在尝试使用自己的命令解释器来测量运行命令所需的时间,但时间是否正确?当我运行命令时,它的时间比预期的要长得多:
miniShell>> pwd
/home/dac/.clion11/system/cmake/generated/c0a6fa89/c0a6fa89/Debug
Execution time 1828 ms
我正在使用gettimeofday
,可以从代码中看到。这不是错的,应该改变,以便时机看起来合理吗?
如果我做一个最小的例子,那么它的外观和运行方式如下:
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int main(int argc, char *argv[]) {
long time;
struct timeval time_start;
struct timeval time_end;
gettimeofday(&time_start, NULL);
printf("run program>> ");
gettimeofday(&time_end, NULL);
time = (time_end.tv_sec-time_start.tv_sec)*1000000 + time_end.tv_usec-time_start.tv_usec;
printf("Execution time %ld ms\n", time); /*Print out the execution time*/
return (0);
}
然后我跑吧
/home/dac/.clion11/system/cmake/generated/c0a6fa89/c0a6fa89/Debug/oslab
run program>> Execution time 14 ms
Process finished with exit code 0
以上14毫秒似乎是合理的,为什么我的命令时间太久了?
答案 0 :(得分:3)
struct timeval中的tv_usec是以微秒为单位的时间,而不是毫秒。
答案 1 :(得分:2)
您错误地计算时间。 tv_usec
代表希腊小写字母μ(“mu”)的u
,持有数微秒。以这种方式修复公式:
gettimeofday(&time_end, NULL);
time = (((time_end.tv_sec - time_start.tv_sec) * 1000000LL) +
time_end.tv_usec - time_start.tv_usec) / 1000;
printf("Execution time %ld ms\n", time); /* Print out the execution time*/
如果long
为32位且经过的时间超过40分钟,最好以64位进行计算以避免溢出。
如果要保留最大精度,请以微秒为单位保持计算并使用小数点打印毫秒数:
gettimeofday(&time_end, NULL);
time = (time_end.tv_sec - time_start.tv_sec) * 1000000 +
time_end.tv_usec - time_start.tv_usec;
printf("Execution time %ld.%03ld ms\n", time / 1000, time % 1000);