2

UNIX の以下のコードは、コマンドによって報告される ~9 秒かかりますtime

int main()
{
    double u = 0;
    double v = 0;
    double w = 0;
    int i;
    for (i = 0;i < 1000000000;++i) {
        v *= w;
        u += v;
    }
    printf("%lf\n",u);
}

v *= w;変更すると実行時間がほぼ2倍になる理由がわかりませんv *= u;

4

3 に答える 3

5

に変更v *= wするとv *= u、2 つのステートメント間に相互依存関係があります。したがって、最初のステートメントは実行前に完了する必要u += vがあります。これは、コンパイラが実行を並列化できないため、パフォーマンスが向上する理由である可能性があります。

于 2013-02-10T16:34:19.237 に答える
2

おそらく、変数 u は変更されているため、独自のメモリが必要であるのに対し、コンパイラは w が変更されていないことを認識しているため、定数にコンパイルできるためです。

于 2013-02-10T16:33:07.253 に答える
1

コンパイラは v*= w を最適化します。v = 0 に。そしておそらく u += v から u = 0; したがって、これらの操作は決して起こりません。

これが私が行ったテストです。すべてのバージョンが 10 回実行され、平均化されました。

for (i = 0;i < 1000000000;++i) {
    v *= w;
    u += v;
}

4.0373 秒



for (i = 0;i < 1000000000;++i) {
    v *= u;
    u += v;
}

7.3733 秒



for (i = 0;i < 1000000000;++i) {
    v *= 0;
    u += 0;
}

4.0149秒

于 2013-02-10T16:32:19.347 に答える