2009-06-29 2 views
4

Visual Studio 2008 SP1을 사용하여 Windows Vista Business x64, 쿼드 코어 컴퓨터, 8GB 램에서 다음 코드를 실행합니다.디버거/IDE를 연결하면 STL 코드가 너무 느리게 실행되는 이유는 무엇입니까?

릴리스 빌드를 빌드하고 명령 줄에서 실행하면 31ms가보고됩니다. 그런 다음 F5 키를 사용하여 IDE에서 시작하면 23353ms가보고됩니다. 여기

는 배 : 421ms
  • DEBUG 상기 IDE에서 : 31ms
  • RELEASE :
  • RELEASE 명령 라인 24,570ms

    • DEBUG는 명령 줄 (모두는 Win32 빌드) , 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, 비주얼 스튜디오 디버거) 기본 힘에 의해 마이크로 소프트 디버거에서 Windows를 실행 기본 힙 대신 디버그 힙을 사용하십시오. Windows 2000 이상에서 기본 힙은 Low Fragmentation Heap이며 디버그 힙과 비교하면 훌륭합니다. HeapQueryInformation을 사용하여 사용중인 힙 종류를 쿼리 할 수 ​​있습니다. 나는 Project Properties->Configuration Properties->Debugging->Environment_NO_DEBUG_HEAP=1를 추가 선호, Visual Studio를 들어 Why the low fragmentation heap (LFH) mechanism may be disabled on some computers that are running Windows Server 2003, Windows XP, or Windows 2000

    :

    은이 기술 자료 문서에서 권장하는 여러 옵션 중 하나를 사용할 수 있습니다, 특정 문제를 해결합니다. 그건 항상 내 속임수 야.

    +1

    감사합니다. _NO_DEBUG_HEAP = 1로 설정하면 디버거가 연결되지 않은 상태에서 코드가 빠르게 실행됩니다. 나는 이것이 비록 어떤 보호/문제 탐지를 잃어 버리고 있다고 상상한다. –

    +1

    많은 디버깅 기능을 잃게됩니다. – MSN

    0

    이렇게 사람이 디버거를 부착하면 어떻게 될지 알 수 있습니다. 그러나 필자는 성능이 30ms에서 23,000ms로 바뀌기를 바랄 수는 없으며 특히 디버거가 부착되었는지 여부에 상관없이 나머지 코드가 빠르게 실행되는 것처럼 보입니다.

    3

    VS IDE에서 포즈를 누르면 추가 시간이 malloc/free에서 소비 된 것으로 나타납니다. 이것은 MS의 malloc에서의 디버깅 지원과 무료 구현이 디버거가 부착 된 경우 추가적인 로직을 가지고 있다고 믿게한다. 이것은 콘솔과 디버거에서 시간의 불일치를 설명합니다.

    편집 :. CTRL + F5 키의 v를 실행하여 확인 된 F5 (1047ms V 9088ms 내 컴퓨터에.)

    +0

    나는 깨뜨린 것이 종종 malloc에 ​​코드를 표시한다는 것을 알았다. –

    관련 문제