Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于java jdk 1.7 64位,使用int的for循环是20+;比具有长循环的for循环快10倍。为什么?_Java_64 Bit - Fatal编程技术网

对于java jdk 1.7 64位,使用int的for循环是20+;比具有长循环的for循环快10倍。为什么?

对于java jdk 1.7 64位,使用int的for循环是20+;比具有长循环的for循环快10倍。为什么?,java,64-bit,Java,64 Bit,请参见下面的编辑 终止检查没有进行任何铸造。我认为,

请参见下面的编辑

终止检查没有进行任何铸造。我认为,<和++在64位机器上的int和long速度一样快。但我想不会吧

int: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);
}
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
降低到更合理的水平,并尝试通过大量运行这两个基准进行比较。