java - 在 java jdk 1.7 64 位中,使用 int 的 for 循环比使用 long 的 for 循环快 20 倍以上。为什么?

标签 java 64-bit

查看下面的修改

终止检查没有进行任何转换。我认为在 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/

相关文章:

assembly - MOV moffs32 在 64 位模式下对地址进行符号或零扩展?

c - 如何编译用 C 编写的 64 位 dll?

linux - 64 位 Linux 上的缓冲区溢出

java - 未送达邮件的原始邮件 header

java - 在哪里可以找到 Java 数组的源代码?

java - 列数与第 1 行的值数不匹配

Java 套接字返回真

java - 把安卓手机变成 handle ,通过wifi连接电脑

odbc - 在 x64 操作系统下使用 C# 查询 Jet 数据库/Excel 文件

php - 我在哪里可以让 PHP 安装在 Windows 服务器 (x64) 上