5

編集:UBを削除した後(良い場所、見逃しました)、時間はほぼ同じです。モデレーターにフラグを立てて削除します。

これらの 2 つの関数は、両方の分岐で ,fooの内側に return があるという事実を除いて同一ですが、最後に単一の関数があります。ifgooreturn

int foo()
{
    static int x = 0;
    if ( x )
    {
        x > 2 ? x = 0 : ++x;
        return x-1;
    }
    else
    {
        x++;
        return x-1;
    }
}
int goo()
{
    static int x = 0;
    if ( x )
    {
        x > 2 ? x = 0 : ++x;
    }
    else
    {
        x++;
    }
    return x-1;
}

数値が表示されるのは、最適化が過度に開始されず、関数呼び出しが最適化されないようにするためです。MSVS 2010で完全に最適化してコンパイルされています。

関数を 4000000000 回呼び出し、10 回サンプリングすると、常に高速fooになりました。

  • foo-平均8830 ミリ秒
  • goo-平均8703 ミリ秒

違いは小さいですが、そこにあります。なんで?また、コンパイラがそれらを同じものに最適化しないのはなぜですか?

4

3 に答える 3

3

アセンブラーの出力を見てください。goo() の最初の分岐で関数の最後にジャンプしている可能性があります。

于 2012-07-09T13:21:29.350 に答える
0

if操作が完了した瞬間に every に戻り値があるためfoo、計算された変数が返されるためだと思います。

goo、2つのリターンを除いて同じことを行うとはいえ、elseステートメントをチェックする必要があります.これには少し時間がかかりますが(非常に短い)、ご覧のとおり、測定可能です.

于 2012-07-09T13:21:42.880 に答える
-3

foo の場合、"if" と "else" の終了ブレースは実行されません。返却後

コントロールが関数の終了ブレースを直接取得するステートメント。

そのため、foo にかかる時間が短くなります。

于 2012-07-09T13:29:55.923 に答える