用time.h测量时间?

时间:2016-03-12 13:08:08

标签: c

我正在尝试使用自己的命令解释器来测量运行命令所需的时间,但时间是否正确?当我运行命令时,它的时间比预期的要长得多:

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毫秒似乎是合理的,为什么我的命令时间太久了?

2 个答案:

答案 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);