Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 为什么添加一行计算会减少运行时间?_Java - Fatal编程技术网

Java 为什么添加一行计算会减少运行时间?

Java 为什么添加一行计算会减少运行时间?,java,Java,在测试我的一个问题的答案时,我写道: public static long timeDouble(int iters) { long start = System.currentTimeMillis(); for (; iters >=0; iters--) { double a = 1.2, b = 2.246, c = 4.4924, d = 8.98488, e = 17.969772; a = Math.sqrt(a);

在测试我的一个问题的答案时,我写道:

public static long timeDouble(int iters) {
    long start = System.currentTimeMillis();
    for (; iters >=0; iters--) {
        double a = 1.2, b = 2.246, c = 4.4924, d = 8.98488, e = 17.969772;
        a = Math.sqrt(a);
        b = Math.cos(b);
        c = Math.sin(c);
        d = Math.tan(d);
        e = a + b - c * d / (e + 1);
        e = Math.pow(e, e);
    }
    return System.currentTimeMillis() - start;
}
此方法的运行时间平均为414ms(使用1000000次迭代)。然而,有件事让我不得不加上这句话:

e = e + d - c * b / (a + 1);
紧靠
e=Math.pow(e,e)之前
添加该行后,计算该方法的时间平均下降到206 ms(使用相同的测试条件)


是什么导致了这种情况?

循环中的值是恒定的,它们不依赖于
iters
。因此,这些值始终是相同的

    double a = 1.2, b = 2.246, c = 4.4924, d = 8.98488, e = 17.969772;
    a = Math.sqrt(a);
    b = Math.cos(b);
    c = Math.sin(c);
    d = Math.tan(d);
    e = a + b - c * d / (e + 1);
    e = Math.pow(e, e);

在第一个版本中,您计算的
e
值为17.969772^17.969772。在第二个示例中,您计算的
e
值为0.69761863561124537^0.69761863561124537。这(根据您自己的证据)更易于计算机。

可能是
e
的值被该等式减小,然后
Math.pow(e,e)
将花费更少的时间来执行。这可能是因为Math.pow(e,e)使用更少的处理器周期,可能是因为e更小。上面的海报可能是正确的,但我通常会避开这种微基准标记,它有很多陷阱。