2

Visual Studio 2005を使用しています。リリースされたら、VisualStudio2012へのアップグレードを検討しています。この小さなプログラムをVisualStudio2012 RCで試してみたところ、Visual Studio 2005よりも2倍以上遅く実行されていることに驚きました。VS2012では、デフォルトのリリースビルド設定を使用しました。私の場合、VS2005では約20ミリ秒、VS2012では約50ミリ秒かかります。なぜそんなに遅いのですか?

#include <windows.h>
#include <deque>

using namespace std;

deque<int> d;

int main(int argc, char* argv[])
{
    const int COUNT = 5000000;

    timeBeginPeriod(1);    

    for (int i = 0; i < COUNT; ++i)
    {
        d.push_back(i);
    }

    double sum = 0;

    DWORD start = timeGetTime();

    for (int i = 0; i < COUNT; ++i)
    {
        sum += d[i];
    }

    printf("time=%dms\n", timeGetTime() - start);

    printf("sum=%f\n", sum);

    return 0;
}
4

3 に答える 3

2

そこで、この質問を Microsoft フォーラムに再投稿しました。 http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/72234b06-7622-445e-b359-88f572b4de52

簡単に言えば、VS2012RC での std::deque::operator[] の実装は、VS2005 に比べて遅いということです。他の一般的な stl コンテナーは、同等またはより高速であることがテストされています。VS2012 が本番環境にあるときに再テストして、operator[] のパフォーマンスが解決されるかどうかを確認することは興味深いでしょう。

ps
こんにちはラファエル・
カール

于 2012-06-22T17:09:26.103 に答える
1

私の疑惑は、スレッドセーフコードに遭遇していて、2012年にデフォルトでマルチスレッドコード用にライブラリが構成されていることです。つまり、dequeアクセスに多数のロックおよびロック解除操作が組み込まれています。

2つのビルドのコンパイラーとリンカーのオプションを比較して、それらの違いを確認してください。

(私はこれを自分で試してみますが、関連するソフトウェアがインストールされたWindowsシステムがありません。申し訳ありません。)

于 2012-06-21T19:16:34.783 に答える
0

これらのループの両方のタイミングを別々に試してください。問題は、新しいコンパイラでは stl コンテナーの実装が遅いことだと思います。

ちょっと待ってください。STL を使用しないもののタイミングを計ろうとしていたのです。

于 2012-06-21T19:09:13.567 に答える