Вопрос по visual-studio, performance, c++, stl – Почему мой код STL работает так медленно, когда у меня подключен отладчик / IDE?

4

Я запускаю следующий код, используя Visual Studio 2008 SP1, в Windows Vista Business x64, четырехъядерный компьютер, 8 ГБ оперативной памяти.

Если я собираю релизную сборку и запускаю ее из командной строки, она сообщает 31 мс. Если я затем запускаю его из IDE, используя F5, он сообщает 23353ms.

Вот времена: (все сборки Win32)

DEBUG, command line: 421ms DEBUG, from the IDE: 24,570ms RELEASE, command line: 31ms RELEASE, from 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";
}
это не так просто, как кажется. :) Alex Black
Эта проблема на самом деле решаема без кода :) Но только если вы испытали это первым. MSN
Вы можете проверить справку по уценке, чтобы лучше отформатировать код crashmstr
сначала вставьте код, затем выделите все и нажмите кнопку кода. :) jalf
да, честно говоря, мне очень трудно работать. :) Я нажал на "код" & apos; кнопку и вставил мой код, он действительно убил его. Alex Black

Ваш Ответ

3   ответа
9

kd, cdb, Visual Studio Debugger) заставляет Windows использовать кучу отладки вместо кучи по умолчанию. В Windows 2000 и выше, кучей по умолчанию являетсяНизкая фрагментарная куча, что безумно хорошо по сравнению с кучей отладки. Вы можете запросить тип кучи, которую вы используете сHeapQueryInformation.

Чтобы решить вашу конкретную проблему, вы можете использовать один из многих вариантов, рекомендованных в этой статье базы знаний:Почему механизм с низкой кучей фрагментации (LFH) может быть отключен на некоторых компьютерах под управлением Windows Server 2003, Windows XP или Windows 2000

Для Visual Studio я предпочитаю добавлять_NO_DEBUG_HEAP=1 вProject Properties->Configuration Properties->Debugging->Environment, Это всегда помогает мне.

Error: User Rate Limit Exceeded Alex Black
Error: User Rate Limit Exceeded
0

это может произойти, когда кто-то подключает отладчик. Однако из-за этого я просто не могу думать о том, что производительность меняется с 30 мс до 23 000 мс, особенно когда кажется, что остальная часть моего кода работает так же быстро, независимо от того, подключен ли отладчик.

3

что дополнительное время затрачивается в malloc / free. Это привело бы меня к мысли, что поддержка отладки в malloc и свободной реализации MS имеет дополнительную логику, если отладчик подключен. Это объясняет расхождения во времени с консоли и отладчика.

РЕДАКТИРОВАТЬ: Подтверждено с помощью CTRL + F5 против F5 (1047ms против 9088ms на моей машине)

Error: User Rate Limit Exceeded Alex Black

Похожие вопросы