【问题标题】:Measuring time in C用 C 测量时间
【发布时间】:2012-10-20 19:09:26
【问题描述】:

我正在尝试测量 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)
  • 也许stackoverflow.com/a/8583395/318716 可能有帮助?正如 Arno 所指出的,粒度因机器而异。
  • [Rant] 投票最多的答案(有 11 个投票)无关紧要。但阿诺或奥威尔(或我)的答案(非常相似)都有票。
  • 我同意 OP 混淆 clock 与例如。 time。但是time 不会帮助他测量“矩阵乘法”。

标签: c time matrix multiplication


【解决方案1】:

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:在 POSIX 系统上,sleep 需要second,而不是毫秒。
  • 同意!这样你就诊断出这是Linux?
  • 我们为什么要转换成双倍? clock_ttime_t 不是 long int 吗?
【解决方案2】:

附带说明,如果您想以更精确的方式(毫秒)测量执行时间,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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如 Orwells answer 中所述使用 QueryPerformanceFrequency() 或使用 GetSystemTimeAsFileTime() 函数。后者的粒度为 100 ns,但不会以该速率递增。它的增量取决于底层硬件和multimedia timer resolution 的设置。 请记住,QueryPerformanceFrequency() 返回的频率被视为常数。但是,由于它是由硬件生成的,因此它也有偏移和时间漂移。使用QueryPerformanceCounter() 测量时间周期通常会伴随每秒数微秒的误差。 我已经给了thisthis关于类似问题的答案。

      【讨论】:

        【解决方案5】:

        如果您不介意与 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;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-08-04
          • 2012-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-10
          • 2013-12-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多