我想知道为什么运行一个长索引与整数索引的循环需要这么长时间?
有什么想法吗?
由于
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");
答案 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循环运行两倍。