在Java中,使用后增量运算符与前增量运算符是否会对性能产生影响?(在其他语言中,在某些上下文中,前增量可能比后增量更快。)
例如,这些循环中是否存在性能差异?
for (int n = 0; idx < max; ++idx) { /* Note pre-increment */
f(max);
}Vs.
for (int n = 0; idx < max; idx++) { /* Note post-increment */
f(max);
}发布于 2012-03-20 01:01:25
性能问题只有在函数行为相同的上下文中才有意义(因为,如果功能不同,正确的行为优于更快的行为),所以我假设您指的是不使用表达式的值的情况?也就是说,表达式的唯一目的是递增i?在这种情况下,答案是否定的:没有性能差异,实际上也没有任何差异。我刚刚编译了这个类:
public class Foo
{
public static void main(final String args[])
{
int i = Integer.parseInt(args[0]);
i++;
}
}并计算得到的Foo.class的MD5校验和;类似地,对于具有++i的版本也是如此。它们具有相同的校验和,这表明两个版本被编译成完全相同的字节码,因此执行起来完全相同。
(从理论上讲,这可能取决于编译器。不同的编译器可能决定编译与++i不同的i++,即使在它们相同的上下文中也是如此。但我对此表示怀疑,即使是这样,也真的不值得担心。)
发布于 2012-03-20 01:48:45
增量本身所需的运行时应该是相同的,但如果您使用的是前增量或后增量,显然可能会影响周围代码的性能,并且在更多情况下可以优化后增量。
还有一些不太明显的情况,周围代码的性能发生了变化。至少当在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);
}https://stackoverflow.com/questions/9774315
复制相似问题