Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 递增:x++;vs x+;=1._Arrays_Optimization_Increment - Fatal编程技术网

Arrays 递增:x++;vs x+;=1.

Arrays 递增:x++;vs x+;=1.,arrays,optimization,increment,Arrays,Optimization,Increment,我读过很多开发人员为了清晰起见使用x+=1而不是x++。我知道,对于新开发人员来说,x++可能是模棱两可的,而且x+=1总是更清晰,但是两者之间的效率有什么区别吗 使用for循环的示例: for(x=0;x

我读过很多开发人员为了清晰起见使用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;
}
while(x<1000){
someArray[x];
x+=1;
}
vs

while(x<1000){
someArray[x++];
}
可以用x+=1替换x++而不损失任何性能吗?我特别关注第二个示例,因为我使用的是两行而不是一行


增加数组中的一个项怎么样?当在大循环中执行时,
someArray[i]++
会比执行
someArray[i]+=1
更快吗?

任何理智或疯狂的编译器都会为两者生成相同的机器代码。

任何体面的编译器都应该能够识别出两者是相同的,因此最终它们之间应该没有性能差异


如果您想说服自己,只需做一个基准测试。

假设您谈论将这些应用于基类型,而没有自己的类,它们可以产生巨大的差异,它们可以产生相同的输出,尤其是在启用优化时。令我惊讶的是,我经常在反编译的应用程序中发现,x+=1在汇编程序级别(add vs inc)上比x++使用得多。

当你说“从长远来看它可能会累加”时,不要这样想

相反,从百分比的角度考虑。当你发现程序计数器有10%或更多的时间在精确的代码中时,你就要担心它了。 原因是,如果百分比很小,那么通过改进它可以节省的最大成本也很小

如果时间百分比小于10%,那么几乎可以肯定的是,在代码的其他部分,您有更大的加速机会,几乎总是以可以避免的函数调用的形式


考虑到您是一个懒惰的编译器实现者,不会费心在机器代码gen模块中编写优化例程

x=x+1

将被转换为以下代码:

mov $[x],$ACC
iadd $1,$ACC
mov $ACC,$[x]
x++将被转换为:

incr $[x] ;increment by 1
如果一条指令在一个机器周期内执行,那么x=x+1将占用3个机器周期,而as x++将占用1个机器周期。(这里使用的是假想机器)



但幸运的是,大多数编译器实现者并不懒惰,他们将在机器代码gen模块中编写优化。因此,x=x+1和x++执行所需的时间应相等:-P

您可以通过运行基准测试来发现这一点!根据您使用的语言,编译器很可能会为这两条语句生成相同的代码。过早优化是万恶之源。为了子孙后代,我更喜欢
x++
而不是
x++=1
我相信后面的例子有两种不同的说法。在第一个示例中,您访问数组someArray的索引x,然后将x增加1。在第二次访问数组someArray的索引x+1时。@YGomez:No,
x++
首先返回
x
,然后增加它。是的,但我必须测试每种语言。我想知道是否有一些经验法则我可以遵循。如果
x++=1
更清楚,为什么人们会使用
x++
++x
?对于解释性语言呢?如果你使用解释性语言,你会有更大的性能问题。我想这就回答了当前的问题。我想可能是这样的,但我只是想确定一下。@tjameson:除此之外,像PyPy和V8这样的JIT编译解释器应该能够处理这样的优化,它们真的是低成本的成果(PyPy家伙优化了堆分配,几个月后这仍然让我惊叹)。@delnan-Huh,那很有趣。这是否意味着他们对开发商撒谎?我假设
new
将数据放在堆栈而不是堆上,但我想这真的没关系,因为地址甚至都不可访问。哈,这很有趣+1获取汇编程序信息。请允许我注意,据我所知,它们是用visual studio编译的,我没有看到原始源代码,因此我无法判断源代码中是+=还是+。@没人-只是好奇,但你认为gcc是这样吗?我真的不能这么说。我认为这取决于许多因素,比如优化和架构设置,但是gcc开发人员或者通过反编译一些准备好的测试用例来回答这个问题。GCC 4.5.0未使用优化添加。在O1-3中使用了lea你说的是真的Mike。然而,理解x++和x+=1通常没有区别是有价值的。如果存在差异,那么理解为什么要以这种或那种方式编码是有意义的。在爪哇和C中考虑字符串连接与字符串生成器。有些情况下,使用其中一个是有意义的,有些情况下,使用另一个也是有意义的。经验法则可以帮助您获得更好的代码和性能,但详细的分析总能给出最终的答案。@aaaa:您当然是对的。在所有这些重要的案例中,重要的原因是它花费了相当多的时间——正如你所说的“有意义”。你和我都知道这只是常识,但我还是很惊讶有多少人还没有学会。是的,没错,但如果我有一个模块,可以从RGB到BGR进行批量转换(有些图像是反向使用的,不要问我为什么)。这将花费它的大部分时间在循环中进行一些位移位。@tjameson:那么我做的就是这样,它总是有效的。拿几个。每一个都告诉我它当时在做什么(更重要的是,确切地说是为什么)。我
incr $[x] ;increment by 1