silverwings
V2EX  ›  问与答

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

  •  
  •   silverwings · Jul 13, 2020 · 2612 views
    This topic created in 2139 days ago, the information mentioned may be changed or developed.

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

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

    对 C++ 里有这种区别存疑, 这都哪一年了, 谁写的编译器啊
    lxk11153
        6
    lxk11153  
       Jul 14, 2020
    需要先创建临时对象?怎么个创建法?
    msg7086
        7
    msg7086  
       Jul 14, 2020 via Android
    C++里没区别。你又不是活在 30 年前。
    djoiwhud
        8
    djoiwhud  
       Jul 14, 2020 via Android
    ++i 性能好些。会减少一个临时变量存储中间值。参考书本:java151 问
    aureole999
        9
    aureole999  
       Jul 14, 2020
    openjdk 14 java 8
    不影响逻辑的情况下++i 和 i++编译的字节码完全一致。
    Intellij 反编译 class 文件后源代码里的 i++会变为++i
    silverwings
        10
    silverwings  
    OP
       Jul 14, 2020
    @lxilu #1
    @hqweay #2
    @jackrelative #8
    @aureole999 #9
    用 IDEA 反编译了一下
    确实所有循环里的 i++、i += 1 、++i 、i = i + 1 都变成了++i
    应该是字节码方面是一样的
    测试环境是 Java11
    silverwings
        11
    silverwings  
    OP
       Jul 14, 2020
    @Jooooooooo #5
    @lxk11153 #6
    这个 C++的相关介绍里有讲
    比如后自增的返回就不是左值
    不是对象本身
    我也是看到这个才想问 Java 的
    而且在几乎所有竞赛里 排名靠前的 C++选手
    清一色都是++i 没有任何后自增
    参考力扣任何一场周赛
    JinTianYi456
        12
    JinTianYi456  
       Dec 18, 2020
    @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);
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3139 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 06:35 · PVG 14:35 · LAX 23:35 · JFK 02:35
    ♥ Do have faith in what you're doing.