【问题标题】:Why is there a difference in execution time while running the same program multiple times?为什么多次运行同一个程序时执行时间会有所不同?
【发布时间】:2016-10-15 05:54:00
【问题描述】:

可能是一个愚蠢的问题。我注意到在 Linux 机器上以 C 运行一个简单的 Hello World 程序时执行时间有所不同(虽然它不是特定于语言的)。

程序:

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

int main()
{
    clock_t begin, end;
    double time_spent;

    begin = clock();

    printf("%s", "Hello World\n");
    end = clock();
    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("%f\n", time_spent);
    return 0;
}

o/p:

$ ./hello 
Hello World
0.000061
$ ./hello 
Hello World
0.000057
$ ./hello 
Hello World
0.000099 

这是在平均负载为 0.4 且可用内存充足的四核机器上测试的。虽然差异很小,但背后的原因是什么?

【问题讨论】:

  • 程序的运行时间太短,因此偏差主要是由于“舍入”错误。
  • 旁白:您可能应该将"\n%s" 更改为"%s\n",因为您的消息可能在end = clock(); 之前没有输出

标签: c linux time operating-system


【解决方案1】:

除非您运行的是实时操作系统,否则您至少会看到运行时间略有不同。这是由于操作系统调度、大约在那个时间可能发生的任何 I/O 等等。

0.04 毫秒的差异根本不是什么大的差异。

如果您的程序循环运行至少几秒钟,则应减少变化的百分比。

【讨论】:

  • 意思是如果我想检查任何 RTOS 中的时间间隔,无论我运行程序多少次或进程之间发生多少上下文切换等,它总是几乎等于实际时间?跨度>
  • @Mazhar 在实时操作系统中,不应该有 任何上下文切换。这就是保证所讨论程序的运行时间的原因。仍然可能存在变化,例如有问题的程序与各种 I/O 设备通信,但没有外部变化。
  • @dbush:“在实时操作系统中,不应该有任何上下文切换” - 错误。 RTOS 保证了确定性的延迟行为,但根本没有。它通常也没有上下文切换(有些实现没有)。如果您的应用程序违反了约束,那么时序行为无论如何都不是确定性的。
【解决方案2】:

简单的答案是:系统的其余部分正在发生什么。

所有这些后台进程都在做“事情”:处理网络数据包;将数据保存或记录到磁盘;决定唤醒并查看当前网络时间;谁知道!对于你的代码这么短的时间间隔,这些微小的事情可以产生很大的不同。尝试循环 1,000 次并检查这些结果。当然,屏幕输出涉及图形、更新、其他程序……也许你应该做一个:

unsigned i, j;
...
// Wait a LONG time!
for (i=0;i<5u;++i) { // 5 is about a minute on my machine
    for (j=0;j<~0u;++j) {
        // Twiddle thumbs!
    } // for
} // for

在你的时间范围内。

【讨论】:

    【解决方案3】:

    两大原因:

    1. 磁盘缓存:第一次加载可执行文件后,它可能会保留在内存中,以便后续运行不需要从磁盘获取。

    2. 系统活动:您的处理器同时在做什么消耗资源(内存、CPU、磁盘访问)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      相关资源
      最近更新 更多