查看下面的修改
终止检查没有进行任何转换。我认为在 64 位机器上, < 和++ 与 int 和 long 一样快。但我想不是吧?
整数:65 毫秒:
public void testWTF() throws Exception {
int runs = 10;
long hs = 0;
long timeSum = 0;
for (int run = 0; run < runs; run++) {
int term = Integer.MAX_VALUE;
long start = System.currentTimeMillis();
// ***** loop to be tested ******
for (int i = 0; i < term; i++) {
hs++;
}
timeSum += (System.currentTimeMillis() - start);
System.out.println("hs = " + hs);
hs = 0;
}
System.out.println("timeSum = " + timeSum);
System.out.println("avg time = " + (timeSum / runs) + " for " + runs + " runs");
System.out.println("hs = " + hs);
}
长:1445 毫秒
public void testWTF() throws Exception {
int runs = 10;
long hs = 0;
long timeSum = 0;
for (int run = 0; run < runs; run++) {
long term = Integer.MAX_VALUE;
long start = System.currentTimeMillis();
// ***** loop to be tested ******
for (long i = 0; i < term; i++) {
hs++;
}
timeSum += (System.currentTimeMillis() - start);
System.out.println("hs = " + hs);
hs = 0;
}
System.out.println("timeSum = " + timeSum);
System.out.println("avg time = " + (timeSum / runs) + " for " + runs + " runs");
System.out.println("hs = " + hs);
}
硬件:64 位至强,运行 Windows 7 64 位。
编辑:我更新了它以进行多次迭代。对于 int 版本的 100 万次运行,平均时间为 65 毫秒。长版本对于 100 万、1000 甚至 100 次来说花费的时间太长。对于 10 次运行,平均时间为 1447 毫秒。
另外,我在循环之外使用 hs,这样循环就不会被抖动。
最佳答案
这是一种非常糟糕/不可靠/不现实的基准测试方法,因为 JIT 并没有真正有机会进行大量优化——您只运行基准测试一次,然后测量第一次运行。
基本上,一旦 Java 的 JIT 看到您的代码被广泛使用,它就会显着优化您的代码。在真实的程序中,JIT 将优化任何关键循环,因此如果您想要一个模仿现实世界的基准测试,您必须说服 JIT 启动。
在 Java 中获得准确基准的最简单方法是使用像 Caliper 这样的工具。知道如何正确预热 JIT 并获得准确的测量,然后查看结果是否更加一致。
关于java - 在 java jdk 1.7 64 位中,使用 int 的 for 循环比使用 long 的 for 循环快 20 倍以上。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9845973/