2016-06-14 208 views
4

可能是一个愚蠢的问题。我注意到在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的平均负载和足够的可用存储器。虽然差别很小,但背后的原因是什么?

+1

该程序的运行时间太短,因此偏差主要是由于“舍入”错误。 – Dummy00001

+0

另外:因为你的消息可能没有在'end = clock()之前输出,所以你应该把''\ n%s“'改成''%s \ n”'' –

回答

6

除非您正在运行实时操作系统,否则运行时间至少会有轻微的变化。这是由于操作系统调度,在那段时间可能发生的任何I/O等。

0.04 ms的差异根本不是很大的差异。

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

+0

意思是我想检查时间间隔在任何实时操作系统中,无论运行程序多少次,或进程间发生了多少上下文切换等,它几乎总是等于实际时间。 – Mazhar

+2

@Mazhar在实时操作系统中,不应该有任何上下文切换。这就保证了程序的运行时间。仍然可能存在变化,例如正在讨论的程序与各种I/O设备通信,但没有外部变化。 – dbush

+3

@dbush:“在实时操作系统中,不应该有任何上下文切换” - 错误。 RTOS保证确定性的延迟行为,但不是没有。它也没有一般的上下文切换(有一些没有的实现)。如果您的应用程序违反约束条件,则时序行为无论如何都不是确定性的。 – Olaf

1

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

有所有这些后台进程都做'stuff':处理网络数据包;保存或记录数据到磁盘;决定醒来并检查当前的网络时间;谁知道!对于这样短的时间间隔作为你的代码,这些微小的东西可以有很大的不同。尝试循环1000次并检查这些结果。当然,输出到屏幕涉及图形,更新,其他程序...也许你应该做一个:

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 

在你的时间。

0

两个主要原因:

  1. 磁盘缓存:一旦你的可执行文件被加载的第一次,也可能保留在内存中,以便在随后的运行中不需要从磁盘取回。

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

相关问题