2009-06-29 53 views
4

我在Windows Vista Business x64,四核心機器,8GB RAM上運行以下代碼,使用Visual Studio 2008 SP1。當我連接了調試器/ IDE時,爲什麼我的STL代碼運行速度太慢?

如果我構建一個發佈版本,並從命令行運行它,它會報告31ms。如果我使用F5從IDE啓動它,則報告23353ms。

這裏是時間:(所有的Win32構建)

  • DEBUG,命令行:421ms
  • DEBUG,從IDE:24,570ms
  • RELEASE,命令行:31毫秒
  • 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

你可能想看看markdown的幫助,所以你可以更好地格式化代碼 – crashmstr 2009-06-29 20:38:19

+0

是的,說實話,我發現它真的很難合作。 :) 我點擊了'代碼'按鈕並粘貼了我的代碼,它真的被屠殺了。 – 2009-06-29 20:39:22

+0

先將代碼粘貼,然後全選,然後單擊代碼按鈕。 :) – jalf 2009-06-29 20:41:16

回答

9

微軟調試器下運行(WinDbg中,KD,CDB,Visual Studio調試器),在默認情況下強制Windows使用調試堆而不是默認堆。在Windows 2000及更高版本上,默認堆是Low Fragmentation Heap,與調試堆相比,它非常好。您可以使用HeapQueryInformation查詢您正在使用的堆的種類。

解決您的特定問題,你可以使用這個知識庫文章中推薦的衆多選項之一: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,我更喜歡加入_NO_DEBUG_HEAP=1Project Properties->Configuration Properties->Debugging->Environment。這對我來說總是有訣竅。

0

所以這聽起來像這可能只是當一個人連接調試器時會發生什麼。然而,由於這個原因,我無法將性能從30ms改爲23,000ms,特別是當我的其他代碼似乎運行速度與調試器是否連接速度一樣快時。

3

在VS IDE中按暫停時顯示額外的時間似乎花費在malloc/free中。這將導致我相信MS的malloc和免費實現中的調試支持在附加調試器的情況下具有額外的邏輯。這將解釋從控制檯和調試器出現的時間差異。

編輯:用CTRL + F5 V上運行的確認F5(1047ms我的機器開V 9088ms)

相關問題