2009-06-29 5 views
4

私はVisual Studio 2008 SP1を使用してWindows Vista Business x64、クアッドコアマシン、8GB RAMに次のコードを実行しています。デバッガ/ IDEを接続したときにSTLコードが遅く動作するのはなぜですか?

リリースビルドをビルドしてコマンドラインから実行すると、31msと報告されます。 IDEからF5を使用して起動すると、23353msが報告されます。ここで

は時間は以下のとおりです(すべてのWin32ビルド)

  • DEBUG、コマンドライン:421ms
  • DEBUG、IDEから:24,570ms
  • RELEASE、コマンドライン:31MS
  • RELEASE 、IDEから:23,353ms

コード:

#include <windows.h> 
#include <iostream> 

#include <set> 
#include <algorithm> 
using namespace std; 

int runIntersectionTestAlgo() 
{ 

    set<int> set1; 
    set<int> set2; 
    set<int> intersection; 


    // Create 100,000 values for set1 
    for (int i = 0; i < 100000; i++) 
    { 
     int value = 1000000000 + i; 
     set1.insert(value); 
    } 

    // Create 1,000 values for set2 
    for (int i = 0; i < 1000; i++) 
    { 
     int random = rand() % 200000 + 1; 
     random *= 10; 

     int value = 1000000000 + random; 
     set2.insert(value); 
    } 

    set_intersection(set1.begin(),set1.end(), set2.begin(), set2.end(), inserter(intersection, intersection.end())); 

    return intersection.size(); 
} 

int main(){ 
    DWORD start = GetTickCount(); 

    runIntersectionTestAlgo(); 

    DWORD span = GetTickCount() - start; 

    std::cout << span << " milliseconds\n"; 
} 
+0

マークダウンのヘルプをチェックして、コードをより適切にフォーマットできるようにしたい場合があります。 – crashmstr

+0

ええ、正直言って私は本当に扱いにくいです。 :) 私は 'コード'ボタンをクリックし、私のコードを貼り付け、それは実際にそれを虐殺。 –

+0

最初にコードを貼り付けてからすべて選択し、コードボタンをクリックします。 :) – jalf

答えて

9

に(windbgの、KD、CDB、Visual Studioのデバッガ)デフォルトの力によって、MicrosoftのデバッガでWindowsを実行していますデフォルトのヒープの代わりにデバッグヒープを使用してください。 Windows 2000以上では、デフォルトのヒープはLow Fragmentation Heapであり、これはデバッグヒープと比較して非常に優れています。 HeapQueryInformationを使用して、使用しているヒープの種類を照会することができます。あなたの特定の問題を解決するために

、あなたは、このKB資料に推奨される多くのオプションのいずれかを使用することができます。Why the low fragmentation heap (LFH) mechanism may be disabled on some computers that are running Windows Server 2003, Windows XP, or Windows 2000

Visual Studioのために、私はProject Properties->Configuration Properties->Debugging->Environment_NO_DEBUG_HEAP=1を追加することを好みます。それはいつも私のトリックです。

+1

ありがとうございました。いったん_NO_DEBUG_HEAP = 1に設定すると、デバッガを接続せずにコードが高速に実行されました。私はこれでいくつかの保護/問題の検出を失っていると思います。 –

+1

多くのデバッグ機能が失われます。 – MSN

0

このように、デバッガが接続されたときの動作と同じように聞こえるかもしれません。しかし、私は30msから23,000msに性能が変わっていくことに頭を下げることはできません。特に、デバッガが接続されているかどうかにかかわらず、残りのコードが速く実行されているように見えます。

3

VS IDEで一時停止を押すと、追加時間がmalloc/freeで費やされたように見えます。これにより、MSのmallocでのデバッグサポートと、デバッガが接続されている場合の無料の実装が追加のロジックを持つと信じることができます。これは、コンソールとデバッガからの時間の不一致を説明します。

EDIT:CTRL + F5をvで実行することにより確認F5(1047ms V 9088ms私のマシン上で。)

+0

私はそれも気づきましたが、mallocにコードが表示されることがよくありました。 –

関連する問題