1

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

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;
}

该方法的运行时间平均为 414 毫秒(使用 1000000 次迭代)。但是,有些东西让我添加了这一行:

e = e + d - c * b / (a + 1);

紧接前e = Math.pow(e, e);加上这条线,计算这种方法的时间平均下降到 206 毫秒(使用相同的测试条件)。

这是什么原因造成的?

4

1 回答 1

3

循环中的值是恒定的,它们不依赖于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。这(根据您自己的证据)更容易计算。

于 2012-07-11T16:28:40.653 回答