效率问题 对于 Java 来说 前自增(++i) 和 后自增(i++) 有区别么?

2020-07-13 23:46:29 +08:00
 silverwings

在 C++里(++C🐶)
存在前自增效率更高的情况
因为后自增需要先创建临时对象
对于 Java 好像没有看到类似报道?

1989 次点击
所在节点    问与答
12 条回复
lxilu
2020-07-14 00:37:18 +08:00
看看字节码
hqweay
2020-07-14 00:43:33 +08:00
Java 的话,编译期优化了。Java 编程思想 有提。
newtype0092
2020-07-14 00:51:46 +08:00
以前习惯 for 循环里最后一定要++i 不能 i++,现在一边是编译器解释器不断优化,一边是机器性能不断攀升,这种微观细节处的效率优化基本没什么大用了,所以关心的人少了。
sunny352787
2020-07-14 00:56:01 +08:00
这种细节编译期都优化的很好了,即便没优化这里也不会是瓶颈,也就学术上有点意义
Jooooooooo
2020-07-14 00:56:39 +08:00
没区别

对 C++ 里有这种区别存疑, 这都哪一年了, 谁写的编译器啊
lxk11153
2020-07-14 01:27:49 +08:00
需要先创建临时对象?怎么个创建法?
msg7086
2020-07-14 01:28:04 +08:00
C++里没区别。你又不是活在 30 年前。
djoiwhud
2020-07-14 01:33:18 +08:00
++i 性能好些。会减少一个临时变量存储中间值。参考书本:java151 问
aureole999
2020-07-14 09:43:20 +08:00
openjdk 14 java 8
不影响逻辑的情况下++i 和 i++编译的字节码完全一致。
Intellij 反编译 class 文件后源代码里的 i++会变为++i
silverwings
2020-07-14 13:07:48 +08:00
@lxilu #1
@hqweay #2
@jackrelative #8
@aureole999 #9
用 IDEA 反编译了一下
确实所有循环里的 i++、i += 1 、++i 、i = i + 1 都变成了++i
应该是字节码方面是一样的
测试环境是 Java11
silverwings
2020-07-14 13:13:32 +08:00
@Jooooooooo #5
@lxk11153 #6
这个 C++的相关介绍里有讲
比如后自增的返回就不是左值
不是对象本身
我也是看到这个才想问 Java 的
而且在几乎所有竞赛里 排名靠前的 C++选手
清一色都是++i 没有任何后自增
参考力扣任何一场周赛
JinTianYi456
2020-12-18 11:56:12 +08:00
@lxk11153 #6
1. https://bbs.csdn.net/topics/190057598#post-140201403
临时对象应该说的是类似上面这个
2. 然后你再细品如下(但感觉只是自我想当然,编译器不知道会编译成什么样呢!
int i=1;
System.out.println((i++)+(i++)+i);
int j=1;
System.out.println((++j)+(++j)+j);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689747

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX