1

関連する質問の 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 ms (同じテスト条件を使用) に短縮されました。

これは何が原因ですか?

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 に答える