执行速度更快,重复相同的语句或循环语句?为什么呢?
重复:
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作为示例,但我的问题是关于所有语言。假设编译器/解释器不进行任何优化。
请回复表演;不是关于可读性,良好做法等。
答案 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条指令。