【问题标题】:why the time is different for the same execution?为什么相同的执行时间不同?
【发布时间】:2015-04-17 17:35:19
【问题描述】:

我正在使用 clock() 计算方法的时间,它给了我相同方法的不同值。

为什么结果会这样?

for(int i=0;i<10;i++){
    start = clock();
    x=FindPrimeNumber(900);
    end = clock();
    cout << end <<" "<< start  <<endl;
}

我使用 #pragma optimize( "", off ) 禁用 JIT 优化 同样的事情

时间:258 时间:255 时间:253 时间:253 时间:251 时间:253 时间:251 时间:254 时间:253 时间:252

第二个问题,我们如何只计算诸如clock()之类的方法的cpu时间,而只计算cpu时间?

windows 的量子值是多少? (比如 40 微秒) 一个quantum就是其他进程可以在cpu上运行的时间?

谢谢大家。

【问题讨论】:

  • 您是在实时操作系统上运行它吗?不?那么操作系统将改变您的程序运行的时间和地点等。也许您的程序有时会因重要的操作系统内容而中断。无论哪种方式,每次都可以相同。
  • 他们相差不大。您是否期望它们每次都打印出完全相同的 same 值?
  • 因为你的程序并不是唯一执行的进程。
  • 在我看来只是简单的误差范围,这与您必须在科学课程中多次重复测试的原因相同。

标签: c++ c time operating-system


【解决方案1】:

这是操作系统indeterminism 的一部分。您可以在(看似)相同的条件下运行您的程序,它的运行速度可能更快或更慢,具体取决于:

  • 有多少个可运行的进程?
  • 可运行进程的行为如何? (高 IO?高 CPU?)

您的流程的优先级甚至可以在执行期间发生变化。例如,如果您的进程正在使用其整个时间片,它可能会被移至调度队列中的较低级别,这意味着您的程序运行频率会降低(操作系统预测未来的使用率会很高)。

无法保证您的进程将在特定时间在 CPU 上运行。


我对你第二个问题的回答:不考虑方法的开始和结束时间,你为什么不计算开始和结束之间的差异?

int start = clock();
methodCall();
int elapsedTime = clock() - start;

就像我之前说的,每次运行它不会给你相同的结果。但是,这应该可以让您大致了解您的方法需要多长时间才能完成。

最后一点:在为平台构建代码时,无论是 Windows、Mac OSX 还是 Linux,您都不应该担心您的时间片有多长。您的进程无法检测到它何时从 CPU 中取出(或者至少在它重新打开之前检测不到)。

进程是操作系统提供的一种抽象,它使我们不必担心如何管理进程的复杂细节。

【讨论】:

    【解决方案2】:

    对于第一个答案,我同意约翰。

    关于第二个答案的更多细节:

    Clock() 方法在 Linux 中给 cpu 时间。请访问以下解释:

    How can I measure CPU time and wall clock time on both Linux/Windows?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多