用C测量时间

aal*_*987 18 c time matrix multiplying

我正在尝试用C(矩阵乘法)测量一些活动,并注意到我应该做这样的事情:

clock_t start = clock();
sleep(3);
clock_t end = clock();
double elapsed_time = (end - start)/(double)CLOCKS_PER_SEC;
printf("Elapsed time: %.2f.\n", elapsed_time);
Run Code Online (Sandbox Code Playgroud)

输出是:

Elapsed time: 0.00.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Fre*_*Foo 30

clock估计程序使用的CPU时间; 这是CPU忙于执行属于您的程序的指令的时间.sleep不执行任何工作,因此它不需要显着的CPU时间(即使它需要挂钟时间).

如果要测量挂钟时间,请使用time:

time_t start = time(NULL);
sleep(3);
printf("%.2f\n", (double)(time(NULL) - start));
Run Code Online (Sandbox Code Playgroud)

将打印一个接近三个的数字.

  • 为什么我们要强制转换为 double?`clock_t` 和 `time_t` 不是一个 `long int` 吗? (3认同)
  • @Arno:在POSIX系统上,`sleep`需要一些`second`,而不是毫秒. (2认同)

Rom*_*net 7

另外,如果您想以更精确的方式(毫秒)测量执行时间,time则不够精确.你可以gettimeofday改用:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

int main() {
    long start, end;
    struct timeval timecheck;

    gettimeofday(&timecheck, NULL);
    start = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    usleep(200000);  // 200ms

    gettimeofday(&timecheck, NULL);
    end = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    printf("%ld milliseconds elapsed\n", (end - start));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)