我读过很多开发人员为了清晰起见而使用x + = 1而不是x ++。我知道x ++对于新开发人员来说可能不明确,而且x + = 1总是更清晰,但两者之间的效率是否存在差异?
使用for循环的示例:
for(x = 0; x < 1000; x += 1)
vs for(x = 0; x < 1000; x++)
我知道它通常不是那么大的交易,但是如果我反复调用一个执行这种循环的函数,那么从长远来看它可能会累加。
另一个例子:
while(x < 1000) {
someArray[x];
x += 1;
}
VS
while(x < 1000) {
someArray[x++];
}
可以用x + = 1替换x ++而不会造成任何性能损失吗?我特别关注第二个例子,因为我使用的是两行而不是一行。
如何增加数组中的项目?在大型循环中完成时,someArray[i]++
会比执行someArray[i] += 1
更快吗?
答案 0 :(得分:19)
任何理智或疯狂的编译器都会为两者生成相同的机器代码。
答案 1 :(得分:5)
假设您谈到将这些应用于基类型而没有自己的类可以产生巨大的差异,它们可以产生相同的输出,尤其是在打开优化时。令我惊讶的是,我经常在反编译应用程序中发现x + = 1在汇编程序级别上使用x ++(add vs inc)。
答案 2 :(得分:4)
任何体面的编译器都应该能够识别出两者是相同的,所以最终它们之间应该没有性能差异。
如果你想说服自己做一个基准......
答案 3 :(得分:0)
当你说“从长远来看可能会加起来”时 - 不要这么想。
相反,请考虑百分比。当你发现程序计数器的确切代码是10%或更多时,那么就要担心它。 原因是,如果百分比很小,那么通过改进它可以节省的最多也是很小的。
如果时间百分比小于10%,那么在代码的其他部分几乎肯定会有更大的加速机会,几乎总是以你可以避免的函数调用的形式。
答案 4 :(得分:0)
认为你是一个懒惰的编译器实现者,并且不会在机器代码生成模块中编写OPTIMIZATION例程。
x = x + 1;
会被翻译成这个代码:
mov $[x],$ACC
iadd $1,$ACC
mov $ACC,$[x]
x ++将被翻译为:
incr $[x] ;increment by 1
如果在一个机器周期中执行一条指令,那么x = x + 1将需要3个机器周期,其中x ++需要1个机器周期。 (这里使用的假设机器)。
但幸运的是,大多数编译器实现者都不是懒惰的,并且会在机器代码生成模块中编写优化。所以x = x + 1和x ++应该花费相同的时间来执行。 :-P