我有以下两个程序:
注意:唯一的区别是循环变量的类型(int和long)。
当我运行这个程序时,第一个程序始终在0到16毫秒之间打印输出,无论N的值为何。第二个程序需要更长时间。对于N == Integer.MAX_VALUE,它在我的机器上大约需要1800毫秒才能运行。运行时间似乎与N呈线性关系。
那么这是为什么呢?
我想JIT编译器会优化int循环。有充分的理由,因为显然它什么也不做。但为什么它不对long循环进行优化呢?
一位同事认为我们可能在long循环中测量JIT编译器正在执行其工作,但由于运行时间似乎与N呈线性关系,这可能并不是真正的原因。
我使用的是JDK 1.6.0更新17版本。
我正在使用Windows XP Professional x64 Edition,Service Pack 2,配备2.40GHz的Intel Core2 Quad CPU。
免责声明 我知道微基准测试在生产中没有用处。我也知道
long startTime = System.currentTimeMillis();
for (int i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
并且
long startTime = System.currentTimeMillis();
for (long i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
注意:唯一的区别是循环变量的类型(int和long)。
当我运行这个程序时,第一个程序始终在0到16毫秒之间打印输出,无论N的值为何。第二个程序需要更长时间。对于N == Integer.MAX_VALUE,它在我的机器上大约需要1800毫秒才能运行。运行时间似乎与N呈线性关系。
那么这是为什么呢?
我想JIT编译器会优化int循环。有充分的理由,因为显然它什么也不做。但为什么它不对long循环进行优化呢?
一位同事认为我们可能在long循环中测量JIT编译器正在执行其工作,但由于运行时间似乎与N呈线性关系,这可能并不是真正的原因。
我使用的是JDK 1.6.0更新17版本。
C:\>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
我正在使用Windows XP Professional x64 Edition,Service Pack 2,配备2.40GHz的Intel Core2 Quad CPU。
免责声明 我知道微基准测试在生产中没有用处。我也知道
System.currentTimeMillis()
并不像它的名字所暗示的那样精确。这只是我在瞎搞时注意到的一些事情,我只是好奇为什么会发生这种情况;仅此而已。