在C语言中测量时间

21

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

为什么会发生这种事情?


你尝试过只打印(end - start)吗? - J.A.I.L.
也许这个链接可以帮到你:https://dev59.com/Cl7Va4cB1Zd3GeqPKYFM#8583395。正如Arno所指出的那样,粒度因机器而异。 - Joseph Quinsey
【抱怨】最高票答案有11个赞,但与问题无关。而Arno、Orwell(或我)的答案(非常相似)都没有得到任何赞。 - Joseph Quinsey
我同意楼主混淆了 clocktime。但是 time 对于他测量“矩阵乘法”没有帮助。 - Joseph Quinsey
5个回答

31

clock函数记录程序使用的CPU时间,即CPU执行属于该程序的指令所用的时间。sleep函数不会执行任何操作,因此不会消耗可观测的CPU时间(即使它花费了墙钟时间)。

如果您想测量墙钟时间,请使用time函数:

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

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


MSDN time()返回自1970年1月1日午夜以来经过的秒数,如果出现错误则返回-1。 sleep(3) 尝试等待3毫秒。这个小延迟可能根本不会改变time()的结果。 - Arno
2
@Arno:在 POSIX 系统上,sleep 接受的是秒数而不是毫秒。 - Fred Foo
同意!这样你就可以诊断出这是Linux了? - Arno
4
为什么要将其转换为double?clock_ttime_t 都不是 long int 吗? - Parth Mehrotra

14

另外提醒,如果您想以更精确的方式(毫秒级别)测量执行时间,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;
}

2
你必须使用time_t start = time(NULL);time_t end = time(NULL);来获取正确的值。

0

可以像Orwell的回答中所描述的那样使用QueryPerformanceFrequency(),或者使用GetSystemTimeAsFileTime()函数。后者具有100纳秒的精度,但不以该速率递增。它的递增取决于底层硬件和多媒体定时器分辨率的设置。 请记住,QueryPerformanceFrequency()返回的频率被视为常量。然而,由于它是由硬件生成的,因此它也具有时间偏移和漂移。使用QueryPerformanceCounter()测量时间段通常会伴随着每秒数微秒的误差。 我已经给出了关于类似问题的thisthis的答案。


-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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接