20

我正在尝试测量 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);

输出是:

Elapsed time: 0.00.

为什么会这样?

4

5 回答 5

31

clock估计程序使用的 CPU 时间;那是 CPU 一直忙于执行属于您的程序的指令的时间。sleep不执行任何工作,因此它不会占用明显的 CPU 时间(即使它需要挂钟时间)。

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

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

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

于 2012-10-31T10:41:52.907 回答
12

作为旁注,如果您想以更精确的方式(毫秒)测量执行时间,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;
}
于 2017-08-19T09:05:46.057 回答
2

您必须使用time_t start = time(NULL);andtime_t end = time(NULL);来获得正确的值。

于 2012-10-31T10:43:08.423 回答
0

使用Orwells 回答中描述的QueryPerformanceFrequency()或使用GetSystemTimeAsFileTime()函数。后者的粒度为 100 ns,但不会以该速率递增。其增量取决于底层硬件和多媒体定时器分辨率的设置。请记住,返回的频率QueryPerformanceFrequency()被视为常数。但是,由于它是由硬件生成的,因此它也有偏移和时间漂移。通过使用来测量时间周期QueryPerformanceCounter()通常会伴随着每秒许多微秒的误差。我已经给出了这个这个关于类似问题的答案。

于 2012-10-31T12:13:25.497 回答
-1

如果您不关心绑定到 Windows,您可以尝试高分辨率计时器。它比 time() 精确得多,因为它使用 UNIX 格式,所以它只有一秒的精度。

#include <iostream>
#include <windows.h>

__int64 countspersec = 0;
double secpercount = 0.0;
__int64 starttime = 0;
__int64 curtime = 0;

int main() {

    // Get current time, and determine how fast the clock ticks
    QueryPerformanceCounter((LARGE_INTEGER*)&starttime);
    QueryPerformanceFrequency((LARGE_INTEGER*)&countspersec);
    secpercount = 1.0/(double)countspersec;

    /* calculate something */

    // Standard end-start stuff, account for clock speed
    QueryPerformanceCounter((LARGE_INTEGER*)&curtime);
    std::cout << "Time needed: " << (curtime-starttime)*secpercount << " sec\n";
    return 0;
}
于 2012-10-31T10:53:05.297 回答