我对此感到困惑。

在我的机器上


直接计算:375毫秒
方法计算:3594毫秒,大约慢了十倍
如果在直接计算之前放置方法校准,则两次都相似。


会在机器中检查吗?

class Test {
    static long COUNT = 50000 * 10000;
    private static long BEFORE;

    /*--------METHOD---------*/
    public static final double hypotenuse(double a, double b) {
        return Math.sqrt(a * a + b * b);
    }
    /*--------TIMER---------*/
    public static void getTime(String text) {
        if (BEFORE == 0) {
            BEFORE = System.currentTimeMillis();
            return;
        }
        long now = System.currentTimeMillis();
        long elapsed = (now - BEFORE);
        BEFORE = System.currentTimeMillis();
        if (text.equals("")) {
            return;
        }
        String message = "\r\n" + text + "\r\n" + "Elapsed time: " + elapsed + " ms";
        System.out.println(message);
    }

    public static void main(String[] args) {
        double a = 0.2223221101;
        double b = 122333.167;
        getTime("");
        /*--------DIRECT CALCULATION---------*/
        for (int i = 1; i < COUNT; i++) {
            Math.sqrt(a * a + b * b);
        }
        getTime("Direct: ");
        /*--------METHOD---------*/
        for (int k = 1; k < COUNT; k++) {
            hypotenuse(a, b);
        }
        getTime("Method: ");
    }
}

最佳答案

两种方式对我来说都是零差异。

如果有的话,这恰恰证明了基准微优化的风险。不要这样完全浪费时间。

至于为什么您会看到与众不同:不知道。我在Win7 Ultimate 64上使用具有正常内存大小的JDK 6u17(32位)。也许您正在使用其他版本。也许这是JIT编译的问题。

无论是什么原因,担心进行方法调用与不进行方法调用之间的区别都是无关紧要的。

关于java - 奇怪的表演行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2842681/

10-10 12:37