首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >I += 1与I=I+1的差异分析

I += 1与I=I+1的差异分析
EN

Stack Overflow用户
提问于 2016-04-08 19:43:56
回答 4查看 417关注 0票数 0
代码语言:javascript
复制
int i = 0;
i += 1;
i = i + 1;

这两种选择有什么区别?在性能时间方面有什么变化?哪个是最强大的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-08 19:47:51

+=进行隐式铸造。例如,这将编译:

代码语言:javascript
复制
int i = 0;
i += 1L;

而这将不会:

代码语言:javascript
复制
int i = 0;
i = i + 1L;

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

代码语言:javascript
复制
0: iconst_0
1: istore_1
2: iinc          1, 1

对于i += 1版本,以及:

代码语言:javascript
复制
0: iconst_0
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: istore_1

对于i = i + 1版本。

因此得出的结论是:您确实可能得到不同的字节码(或不可能,请参阅@TDG答案)和不同的性能,但与您的程序所拥有的其他间接费用相比,差别不大。

票数 6
EN

Stack Overflow用户

发布于 2016-04-08 19:48:28

您必须考虑生成的程序集代码和生成的程序集代码完全取决于所使用的编译器。一些编译器将使这些差异不复存在,因为它们将对语句进行性能调优。但是总的来说..。

代码语言:javascript
复制
i += 1;

比..更有效率。

代码语言:javascript
复制
i = i + 1;

因为"i“的地址只能在"i += 1”中访问一次。它为您节省了一个程序集操作,这通常不是什么大事,除非您的计算可以通过多次迭代完成。它会为您节省一个程序集"mov“指令。

票数 2
EN

Stack Overflow用户

发布于 2016-04-08 20:13:25

接下来两个“程序”的Byte Code

代码语言:javascript
复制
//first "program"
int i = 0;
i = i + 1;

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

是一样的:

代码语言:javascript
复制
0: iconst_0
1: istore_1
2: iinc          1, 1
5: return

当解压缩上面的Byte Code时,我们得到-

代码语言:javascript
复制
int i = 0;
++i;

所以你用哪一种并不重要。

编辑在jdk1.7.0_79和Eclipse3.8.2上进行了测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36508069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档