分析i + = 1和i = i + 1之间的差异

时间:2016-04-08 19:43:57

标签: java

int i = 0;
i += 1;
i = i + 1;

这两个选项有什么区别?表现时间方面有什么变化?哪个最强大?

4 个答案:

答案 0 :(得分:6)

+ =隐式投射。例如,这将编译:

int i = 0;
i += 1L;

这不会:

int i = 0;
i = i + 1L;

尝试在Windows 8上使用我的jdk1.8.0_11编译两个片段并查看字节码差异...

0: iconst_0
1: istore_1
2: iinc          1, 1

代表i += 1版本,并且:

0: iconst_0
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: istore_1

代表i = i + 1版。

所以结论是:你可能确实得到了不同的字节码(或者可能没有,请参阅@TDG答案)和不同的性能,但与你的程序将拥有的其他开销相比,这种差异是微不足道的。

答案 1 :(得分:2)

您必须考虑生成的汇编代码以及生成的汇编代码完全取决于正在使用的编译器。有些编译器会使这些差异不存在,因为它们会对您的语句进行性能调整。但总的来说......

i += 1;

略高于......

i = i + 1;

因为" i"的地址仅在" i + = 1"中访问一次。它为您节省了一个装配操作,除非您的计算可以通过多次迭代完成,否则这通常不是什么大问题。它可以为你节省一个装配" mov"指令。

答案 2 :(得分:1)

接下来的两个"程序中的Byte Code":

//first "program"
int i = 0;
i = i + 1;

//second program
int i = 0;
i += 1;

是一样的:

0: iconst_0
1: istore_1
2: iinc          1, 1
5: return

当反编译上面的Byte Code时,我们得到了这个 -

int i = 0;
++i;

所以你使用哪一个并不重要。

编辑以上内容在jdk1.7.0_79和Eclipse 3.8.2上进行了测试。

答案 3 :(得分:0)

import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { let introLabel = childNodeWithName("introLabel") if(introLabel != nil) { let fadeOut = SKAction.fadeOutWithDuration(1.5) introLabel?.runAction(fadeOut, completion: { let doors = SKTransition.doorwayWithDuration(1.5) let shooterScene = SKScene(fileNamed: "ShooterScene") self.view?.presentScene(shooterScene!, transition: doors) }) } } /* Called before each frame is rendered */ override func update(currentTime: CFTimeInterval) { } } 它必须加载i的值,向其中添加一个,然后将结果存储回i

i=i+1;添加一个,然后存储结果

编辑1:有人说第二个(i + = 1)更快,但是如果你在C ++(vs 2013)中反编译这个部分代码,你可以看到它们是相同的。不幸的是,我不知道如何在JAVA中做到这一点。

i+=1;