具有整数与长索引的性能循环

时间:2015-03-29 17:37:02

标签: java for-loop integer long-integer

我想知道为什么运行一个长索引与整数索引的循环需要这么长时间?

有什么想法吗?

由于

int n = 1000_000_000;
long n2 =n;
long t1 = System.currentTimeMillis();
for( int idx = 0; idx<n;idx++){

}
long t2 = System.currentTimeMillis();
for( long idx = 0; idx<n2;idx++){

}
long t3 = System.currentTimeMillis();
long dt1 = t2-t1;
long dt2 = t3-t2;
System.out.println("with int = took " + dt1 +"ms");
System.out.println("with long = took " + dt2 +"ms");

2 个答案:

答案 0 :(得分:2)

这可能与您的JVM使用的字大小有关。对于32位字长,ints将需要一个字,而longs则需要2个字进行存储。所以基本上读取long值基本上是2次读取,写入它们再次是2次写入。

另一件事是增量操作。 long类型增量的JVM规范doesn't have any instruction set。它有iinc,但没有linc。因此,增量操作也必须经过iinc(可能再次使用2个单词,可能还会导致2 iinc个操作)。总之,long类型的算术与int类型相比有点复杂。但肯定不应该有太多担忧。我猜这些可能是造成轻微缓慢结果的原因。

答案 1 :(得分:0)

Java的优化器(Oracle JDK 1.8.0_60)能够忽略int循环,但它不知道如何优化长循环。

n从1000_000_000更改为2000_000_000对int循环的运行时间没有影响,但它会导致long循环运行两倍。