【问题标题】:Question regarding the clock() function关于clock()函数的问题
【发布时间】:2011-03-31 01:59:43
【问题描述】:

为什么在调试模式下执行函数 f1() 的时间会从一次运行变为另一次?为什么在发布模式下总是为零?

我没有包含 stdio.h 和 cstdio 和编译的代码。怎么样?

#include <iostream>
#include <ctime>

void f1()
{
    for( int i = 0; i < 10000; i++ );
}

int main()
{
    clock_t start, finish;

    start = clock();
    for( int i = 0; i < 100000; i++ ) f1();
    finish = clock();

    double duration = (double)(finish - start) / CLOCKS_PER_SEC;

    printf( "Duration = %6.2f seconds\n", duration);
}

【问题讨论】:

    标签: visual-c++


    【解决方案1】:

    您运行测试代码的机器可能太快了。尝试将循环计数增加到一个非常大的数字。

    要尝试的其他事情是使用 sleep() 函数进行测试。 这应该确认您的 clock() 测量的行为。

    【讨论】:

    • 你有机会做一个小的编辑吗?我错过了您关于使用sleep() 进行测试的评论,我想改变我的投票。对不起。
    • 没有问题。我正在考虑提供一些关于如何确定他的时钟()是否正常工作的调试技巧。但是,是的,我同意优化可能会将该循环转换为什么都不做。
    【解决方案2】:

    我相信您在发布模式下看到 f1() 的运行时间为零的原因是编译器正在优化该函数。由于您的 for 循环没有代码块,因此可以在编译期间有效地将其拉出。

    我猜这个优化不是在调试模式下执行的,这可以解释为什么你会看到更长的执行时间。它在运行之间会有所不同,这仅仅是因为您的操作系统调度程序(几乎可以肯定)不保证进程的固定时间段。

    至于为什么在没有明确包含&lt;cstdio&gt;的情况下可以使用printf(),是因为&lt;iostream&gt;包含。

    通过查看 C:\Program Files\Microsoft Visual Studio 10.0\VC\include 的标题,我可以看到 iostream 包含 istreamostream,两者都包含 ios,其中包含 xlocnum,其中包含 cstdlib cstdio.

    【讨论】:

    • 我改变了函数 f1() 来计算前 10000 个整数的总和并返回这个值。释放模式在执行时间仍然返回 0。
    • 终于找到了release模式下执行时间大于0的情况。
    • @jaayrosa,我不确定我对编译器优化的假设是否正确,但可能是空循环。如果您仍然在循环中看到 0 运行时带有指令,则很可能发生了其他事情(请参阅 hopia 的答案。)
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2011-09-08
    相关资源
    最近更新 更多