什么是更快的执行,相同的语句重复或循环语句?

时间:2017-07-23 15:27:54

标签: performance loops

执行速度更快,重复相同的语句或循环语句?为什么呢?

重复:

printf("Hello, world!\n");
printf("Hello, world!\n");
printf("Hello, world!\n");
printf("Hello, world!\n");
printf("Hello, world!\n");

毛圈绒:

for (int i = 0; i < 5; i++)
    printf("Hello, world!\n");

printf("Hello, world!\n");可以是任何一段代码。

我使用C作为示例,但我的问题是关于所有语言。假设编译器/解释器不进行任何优化。

请回复表演;不是关于可读性,良好做法等。

4 个答案:

答案 0 :(得分:1)

性能方面,使用循环语句执行代码N次或在没有循环的情况下编写相同代码N次之间的区别可以忽略不计。使用循环可能会导致性能稍差,因为它包含迭代器i递增和比较,这是2个额外的CPU计算。

没有循环:O(n)

使用循环:O(3n)

非常粗略地)

答案 1 :(得分:0)

打印的语句更快,仅需要时间打印5次,但在循环时间内增加,初始化和条件检查将被包括在内。但这一次可以忽略不计。

答案 2 :(得分:0)

我猜重复的陈述更快,因为: 因为在循环条件中检查和索引也需要时间,所以语句的数量更大,执行

需要更多的时间

答案 3 :(得分:0)

假设没有优化和循环的简单编译器实现,展开的版本将始终使用较少的指令执行。实际上,循环展开是一种常见的编译器优化。

要理解原因,请考虑每次调用print语句的成本都相同。让我们说这是一个“操作”。对于重复调用示例,成本恰好是5次操作。

在循环示例中,您将拥有相同的5个打印操作,但您还需要执行评估循环条件和更新索引变量所需的操作。在开始时,您必须分配初始索引值(1次操作),并且在每次迭代时,您必须评估条件(1次操作)并递增索引(1次操作)。所以你在循环案例中的总操作是

      1 initialization 
+ 5 * 2 condition & increment
+ 5 * 1 print 
--------------------------------
=    16 total operations

差异很大!

现在实际上,打印操作需要比循环簿记更多的指令,因此使用循环看到的实际减速可以忽略不计。但是对于某些循环,评估循环体需要比计算循环条件更少的指令,并且您会看到滚动和展开循环之间的性能差异很大。一个简单的例子:

int sum = 0;
for (int i = 0; i < 5; i++) sum += i;

这里,可以在大多数体系结构的单个sum += i指令中评估循环体(add)。这与递增索引变量i的指令数相同!因此,通过将其写为循环,我们将执行时间从5 add指令加倍到10 add条指令以及评估条件所需的指令。

然而,值得注意的是,循环展开是以增加代码大小为代价的。较大的二进制文件会给内存系统带来更大的压力,从而可能导致执行速度变慢。对于重复操作,编译后的二进制文件必须包含在每次重复时计算该操作的代码。假设print操作需要20条指令,并且在没有循环的情况下调用它1000次。您的二进制文件必须包含20000条指令!但是如果你使用循环,你只需输出一次print操作的指令,再加上一些循环评估指令(可能是10)。所以你的二进制文件在循环的情况下只有30条指令。