Почему мой STL-код работает так медленно, когда у меня есть отладчик/IDE?

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

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

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

  • DEBUG, командная строка: 421мс
  • DEBUG, из IDE: 24,570 м.
  • RELEASE, командная строка: 31 мс
  • RELEASE, из IDE: 23,353мс

код:

#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";
}

Ответ 1

Запуск под отладчиком Microsoft (windbg, kd, cdb, Visual Studio Debugger) по умолчанию заставляет Windows использовать кучу отладки вместо кучи по умолчанию. В Windows 2000 и выше куча по умолчанию представляет собой Low Fragmentation Heap, которая безумно хороша по сравнению с кучей отладки. Вы можете запросить тип кучи, который вы используете с HeapQueryInformation.

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

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

Ответ 2

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

EDIT: подтверждено запуском с помощью CTRL + F5 v. F5 (1047мс против 9088 мс на моей машине)

Ответ 3

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