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

时间:2012-07-11 16:21:38

标签: java

在测试我related questions之一的答案时,我写道:

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毫秒(使用相同的测试条件)。

造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分: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。这是(通过您自己的证据)更容易计算机。