对于java jdk 1.7 64位,使用int的for循环是20+;比具有长循环的for循环快10倍。为什么?
请参见下面的编辑 终止检查没有进行任何铸造。我认为,<和++在64位机器上的int和long速度一样快。但我想不会吧 int:65毫秒:对于java jdk 1.7 64位,使用int的for循环是20+;比具有长循环的for循环快10倍。为什么?,java,64-bit,Java,64 Bit,请参见下面的编辑 终止检查没有进行任何铸造。我认为,
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);
}
public void testWTF()引发异常{
整数=10;
长hs=0;
长时间um=0;
对于(int run=0;run
长: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);
}
public void testWTF()引发异常{
整数=10;
长hs=0;
长时间um=0;
对于(int run=0;run
硬件:64位Xeon运行windows 7 64位
编辑:我更新了它以进行多次迭代。对于使用int版本的100万次运行,平均时间为65毫秒。对于100万、1000甚至100万人来说,长版本花费的时间太长。10次运行的平均时间为1447毫秒。
另外,我在循环外使用hs,这样循环就不会受到JIT的影响。这是一种非常糟糕/不可靠/不现实的基准测试方法,因为JIT实际上没有机会进行太多优化——只运行一次基准测试,然后测量第一次运行 基本上,一旦Java的JIT看到您的代码被广泛使用,它将更显著地优化您的代码。在一个真实的程序中,JIT将优化任何关键循环,因此如果你想要一个模仿真实世界的基准测试,你必须说服JIT开始
在Java中获得准确基准的最简单方法是使用这样一个工具,它知道如何正确地预热JIT并获得准确的测量值,然后看看结果是否更一致。您是否多次运行过这个工具?如果你只运行一次,这可以解释巨大的时差。我不能确认你的结果。对于int版本i,平均时间为1475ms,对于长版本1463ms,可运行10次。在Windows 8 64位和JDK 7 update 13 64位上运行看起来JIT足够智能,可以完全消除
int
的循环,可能只是用赋值hs=term
替换整个循环。字节码对于long
来说更为复杂,这可能表明JIT在这种情况下不够聪明。不管怎样,它都不是一个真实的基准测试。我对它做了一些修改,以便hs必须在循环之外使用。这使得int大约为65ms。有时需要运行10000次基准测试才能启动JIT。将term
降低到更合理的水平,并尝试通过大量运行这两个基准进行比较。