【问题标题】:Execution time using clock() gives 0 clock cycles使用 clock() 的执行时间给出 0 个时钟周期
【发布时间】:2020-08-26 15:18:02
【问题描述】:

我希望能够对应用程序特定部分的执行时间进行计时。
这是一个简化的代码来显示我无法理解的内容:

#include <stdio.h>
#include <time.h>

void fun(){
    double result = 0;
    for (int i = 1; i<200;i++){
        for (int j = 1; j<200;j++){
            result += i/j;              // Random mathematical expression
        }
    }
}

int main(int argc, char const *argv[])
{
    clock_t start, end;

    start = clock();

    fun();

    end = clock();  

    clock_t clocks_taken = (end - start);
    double total_time = ((double)(end - start)/CLOCKS_PER_SEC)*1000; //millisec

    printf("Clock cycles: %d. Total time: %lf ms", clocks_taken, total_time);
}

给出输出:

Clock cycles: 0. Total time: 0.000000 ms

据我所知,时钟周期是处理器的一次执行,而嵌套的 forloop 应该需要数百个周期?还是我弄错了?

即使当前示例没有,我也需要能够测量大约需要 1 毫秒的任务的执行时间。如果重要的话,我正在 Windows 中构建和运行应用程序。

【问题讨论】:

  • 调试这个过程会发生什么? startendclocks_takentotal_time的值是多少?
  • @Dominique 据我所知,使用 printf,endstart 每次尝试都具有相同的值,在实际应用中,它们有时会相差一个,但不会超过这个值。
  • int fun()return result; 然后printf ("result: %d\n", fun()); 以确保您的函数没有被完全优化掉——它没有副作用。
  • 您是否尝试过使用大到需要等待整秒钟才能完成整个过程的值?
  • @paddy 哦,不是吗?我读到:“C 库函数clock_t clock(void) 返回自程序启动以来经过的时钟节拍数”结合“时钟节拍通常指的是主系统时钟,它以66 MHz 运行。”也许我将它视为一个单一的指令是错误的,但 66MHz 应该足以满足我的需要。

标签: c clock


【解决方案1】:

您不使用result,因此不需要计算。由于您的函数没有任何可观察的功能,因此几乎不需要任何时间。对“玩具”代码进行基准测试毫无意义。

请注意,“时钟周期”不是 CPU 时钟周期。它们是某种 CPU 使用计时器的周期,可能会以惊人的大增量滴答作响。你平台上的CLOCKS_PER_SEC是什么?

【讨论】:

  • 即使我将结果返回给 main 它也不会改变任何东西。
  • 它将您的问题从对玩具代码进行基准测试转变为对时钟分辨率太少的代码进行基准测试。那是一个不同的问题。 (请注意,返回结果可能还不够。你还没有使用它,所以它仍然不需要计算。我再次敦促你,不要对玩具代码进行基准测试。)
  • 如果我将它打印为 int 似乎只有 1000.... 这可能吗?这将解释我的问题。有没有更好的方法来获得更高的分辨率?我使用的是标准的 1 岁公司笔记本电脑。
  • 也许可以使用更现代的功能,例如 getrusage 或您平台上推荐的任何功能。同样,clock 是古老的。
猜你喜欢
  • 2017-02-11
  • 2019-06-10
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2011-11-20
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多