【问题标题】:What is the difference? And does this matter in bigger loops?有什么不同?这在更大的循环中重要吗?
【发布时间】:2019-01-31 08:57:52
【问题描述】:

我想知道在做这两个操作时是否存在复杂性和时间差异:

1)

int sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum = sum + i;
}

2)

int sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum += i;
}

或者也许将问题想象成更大的数字/数据,这只是一个例子。

【问题讨论】:

  • 差别很小,你真的不应该为此烦恼。我认为java甚至可以将sum += i编译成sum = sum + i
  • 可能两者都会编译成相同的字节码。
  • 这在 Java 中很难验证(在 C 中你可以编译代码并检查汇编程序)。我猜想会产生相同的字节码:实际上是++sum,这一直是驴多年的本机机器代码指令。
  • @Bathsheba 您也可以使用javap 签入Java。
  • 事实上它们编译成相同的字节码。

标签: java performance time


【解决方案1】:

从性能的角度来看,这些变体是相同的(两者都将作为 java 字节码中的 iadd 指令)

但是 sum += 1 替换为 sum = (int) (sum + 1) 它对于 byteshort 这样的类型有不同的编译 例如。这段代码将被编译

byte i = 0;
for(int j = 0; j < 10; j++) {
    i += j; //i = (byte) (i + j)
}

但是你会得到代码的编译错误

byte i = 0;
for(int j = 0; j < 10; j++) {
    i = i + j;
}

【讨论】:

    【解决方案2】:

    优先级有所不同,复合赋值 sum += i 不如赋值和加法 sum = i + 1 主要。 增量i++ 更为主要。

    更多信息:operator precedence

    【讨论】:

    • 优先级在这个问题的上下文中似乎无关紧要。
    • 比优先级更重要的是+= doesn't require a cast,但这也无关紧要
    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2012-01-17
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多