-5

g ++を使用すると3秒実行される次のコードがあり、Microsoftコンパイラでは30秒以上実行され、理解できません...

struct constraint{
    int bitline;
    int result;
};  

// this vector is filled with about 1 milion items
vector<constraint> constraints;

for (int a = 0; a < constraints.size(); ++a)
{
    if (a% 100 == 0) cout << a << " "<<endl;
    for (int b = a; b < constraints.size(); ++b)
    {
        int anded = constraints[a].bitline & constraints[b].bitline;
        int ored =  constraints[a].bitline | constraints[b].bitline;

        // a subset of b
        if (anded == constraints[a].bitline && constraints[a].result >= constraints[b].result )
        {
            // delete a
            constraints[a].bitline = 0;
        }
        if (anded == constraints[b].bitline && constraints[b].result >= constraints[a].result )
        {
            constraints[b].bitline = 0;
        }

    }
}

編集: 最適化フラグは使用しません。Windows XP 32 ビットで実行します...「debug cout line」なしで試してみましたが、大きな変化はありませんでした。

4

2 に答える 2

6

いいえ。

まず、MSVC++ には確かに欠陥がありますが、生成されたコードのパフォーマンスは一般的に悪いとは考えられていません。

次に、「コンパイラ作成者は脳死状態か」テストを使用します。Microsoft のエンジニアは、競合他社の10倍も遅いコンパイラを作成し、それを改善するために働かないとは、どれほど信じられないほど愚かである必要があるでしょうか? 10% または 50% は「Microsoft のコンパイラはくだらないコードを生成するだけ」で説明できますが、1000% ですか? おそらくそうではありません。したがって、他の場所で説明を探す必要があります。:)

そして説明は簡単です:

ベンチマークは、2 つのコンパイラによって生成されるコードの速度をテストしていません。最適化が無効になっているときに、どのコンパイラが最もデバッグ チェックを挿入するかをテストしています。デバッグ目的で使用する」 .

そして、これらの指示が与えられると、Microsoft は、GCC よりも多くの追加の正確性チェックと実行時チェックを挿入します。したがって、その実行可能ファイルは遅くなります。

ベンチマークの場合、ルール 1 は常に enable Optimizationsです。

それ以外のことは、競技者に走るべきだと言わずに誰が一番速いかを測ろうとするようなものです。ゴールに向かう代わりにサンドイッチを作るために台所に行った男は、必ずしも遅いランナーではなく、ゴールに向かって走るように指示を受けなかった.

あなたのコードの最大の犯罪者 (ただし唯一ではない) は、おそらく、デバッグ ビルドの MSVC でoperator[]、ベクトルに追加の範囲チェックが含まれていることです。std::vectorとはいえ、スピードを重視する場面では、「ああ、使うのをやめる」ではなく、「ああ、最適化を有効にした方がいいかもしれない」が正解です。

于 2013-05-18T09:39:37.020 に答える