当我连接调试器/ IDE时,为什么我的STL代码运行得如此之慢?

时间:2009-06-29 20:29:07

标签: c++ visual-studio performance ide stl

我在Windows Vista Business x64,四核机器,8gb ram上使用Visual Studio 2008 SP1运行以下代码。

如果我构建一个发布版本,并从命令行运行它,它会报告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";
}

3 个答案:

答案 0 :(得分:9)

默认情况下,在Microsoft调试器(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=1添加到Project Properties->Configuration Properties->Debugging->Environment。这总是对我有用。

答案 1 :(得分:3)

在VS IDE中按暂停表示额外的时间似乎花费在malloc / free中。这将使我相信,如果连接了调试器,MS的malloc和free实现中的调试支持会有额外的逻辑。这可以解释控制台和调试器之间的差异。

编辑:使用CTRL + F5 v.F5(我的机器上1047ms v.9088ms)运行确认

答案 2 :(得分:0)

所以听起来这可能只是当一个人附加调试器时会发生什么。但是,由于这一点,我无法理解性能从30ms变为23,000ms,特别是当我的其余代码看起来运行速度同样快,无论是否附加了调试器。