V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
silverwings
V2EX  ›  问与答

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

  •  
  •   silverwings · 2020-07-13 23:46:29 +08:00 · 1823 次点击
    这是一个创建于 1379 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    对 C++ 里有这种区别存疑, 这都哪一年了, 谁写的编译器啊
    lxk11153
        6
    lxk11153  
       2020-07-14 01:27:49 +08:00
    需要先创建临时对象?怎么个创建法?
    msg7086
        7
    msg7086  
       2020-07-14 01:28:04 +08:00 via Android
    C++里没区别。你又不是活在 30 年前。
    djoiwhud
        8
    djoiwhud  
       2020-07-14 01:33:18 +08:00 via Android
    ++i 性能好些。会减少一个临时变量存储中间值。参考书本:java151 问
    aureole999
        9
    aureole999  
       2020-07-14 09:43:20 +08:00
    openjdk 14 java 8
    不影响逻辑的情况下++i 和 i++编译的字节码完全一致。
    Intellij 反编译 class 文件后源代码里的 i++会变为++i
    silverwings
        10
    silverwings  
    OP
       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
        11
    silverwings  
    OP
       2020-07-14 13:13:32 +08:00
    @Jooooooooo #5
    @lxk11153 #6
    这个 C++的相关介绍里有讲
    比如后自增的返回就不是左值
    不是对象本身
    我也是看到这个才想问 Java 的
    而且在几乎所有竞赛里 排名靠前的 C++选手
    清一色都是++i 没有任何后自增
    参考力扣任何一场周赛
    JinTianYi456
        12
    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);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3257 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:35 · PVG 21:35 · LAX 06:35 · JFK 09:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.