【问题标题】:Is using an int and then incrementing it slower than doing both simultaneously?使用一个 int 然后增加它比同时做两个慢吗?
【发布时间】:2015-09-29 22:20:03
【问题描述】:

我最近遇到了一些旧的源代码,我注意到这样的模式:

T item = array[index];
index++;

这样表达会不会更快

T item = array[index++];

?直到最近我还认为不会有区别,因为我认为它是 index = index + 1 的简写,所以无论哪种方式,你都会取消引用 index 两次。但是this post 让我不这么认为;相反,您只会获得一次 index 的值。

这会在性能上产生任何差异(无论多么小),还是现代 JIT 会对此进行优化?

【问题讨论】:

  • 您想了解哪种语言?为什么同时标记 Java 和 C#?
  • @hagrawal 因为 JVM 和 CLR 都是 JIT,据我了解,它们的功能相似(此外,增加 int 主要与语言无关)。
  • 你的 2 个代码 sn-ps 在哪种循环中 - for, while ??
  • 编写一个基准程序并确定它们的相对性能其实很简单。
  • @JamesKo 是的,两者都是 JIT,但它们的优化算法会有所不同。您可能还会看到每种情况下生成的不同机器代码指令。

标签: java c# performance increment jit


【解决方案1】:

大多数现代语言会在编译或执行时进行优化。 像这样简单的东西会在编译时直接优化。

但请注意,您的示例只是一个错字问题,在 2 种情况下 Java 会理解 T item = array[index++]; 作者:

  • 获取索引位置的对象
  • 索引加 1

这和写作是一回事

T item = array[index];
index++;

(但与T item = array[++index]; 不同的是:

index++;
T item = array[index];

编辑: 我还可以补充说,循环也得到了改进,编译或执行时间 以 C 或 C++ 为例

for(int i = 0; i < 1000; i++) {
    t[i] = 0
}

会变成等价于

for(int i = 0; i < 1000; i++) {
   *(t++) = 0
}

总之,编译器和虚拟机将改进您的代码,请多考虑所选择的算法和数据结构。

【讨论】:

    【解决方案2】:

    我相当肯定,在执行其他操作的同一行上递增所述整数被认为是不好的做法。

    类似于您提供的示例 (T item = array[index++];) 的内容最好变成类似

    index++
    T item = array[index];
    

    【讨论】:

    • 根据 Java 语言规范,这确实是一种不好的做法:“当每个表达式最多包含一个副作用时,代码通常会更清晰,作为其最外层的操作,并且当代码不完全依赖于哪个异常时由于表达式的从左到右评估而出现。” 15.7. Evaluation Order
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2012-04-20
    • 2021-08-29
    • 2018-07-24
    相关资源
    最近更新 更多