后增量和增量前运算符之间的性能差异?

时间:2012-03-19 16:51:12

标签: java performance

在Java中,使用后增量与预增量运算符会产生任何性能影响吗?

示例:

i++

++i

2 个答案:

答案 0 :(得分:18)

性能问题仅在功能行为相同的上下文中才有意义(因为,​​如果功能不同,正确的行为优于稍微快一点的行为),所以我假设你指的是到没有使用表达式的值的情况?也就是说,表达式的唯一目的是增加i?在这种情况下,答案是否定的:没有性能差异,事实上,没有任何区别。我刚刚编译了这个类:

public class Foo
{
    public static void main(final String args[])
    {
        int i = Integer.parseInt(args[0]);
        i++;
    }
}

并计算得到的Foo.class的MD5校验和;而且,类似于++i的版本。它们具有相同的校验和,表明这两个版本被编译为 exact 相同的字节码,因此将完全相同地执行

(当然,从理论上讲,这可能取决于编译器。不同的编译器可能决定以i++编译++i,即使在它们相同的上下文中也是如此。但我怀疑,即使在这种情况下,确实也不值得担心。)

答案 1 :(得分:2)

增量本身所需的运行时应该是相同的,但是如果使用前或后增量显然可能会对周围代码的性能产生影响,并且在更多情况下可以优化后增量程。

还有一些非显而易见的情况,其中周围代码的性能发生了变化。至少在x86或x64硬件上使用Oracle的服务器VM运行时,以下循环在运行时间有显着差异:

long a=0, b=0;
for(int i=0;i<1000000;i++) {
    b = 3;
    a += i * (b++);
}

...

long a=0, b=0;
for(int i=0;i<1000000;i++) {
    b = 3;
    a += i * (++b);
}