Почему мой код STL работает так медленно, когда у меня подключен отладчик /IDE?
Я запускаю следующий код, используя Visual Studio 2008 SP1, на Windows Vista Business x64, четырехъядерный компьютер, 8 ГБ оперативной памяти.
Если я собираю релизную сборку и запускаю ее из командной строки, она выдаёт 31 мс. Если я затем запускаю его из IDE, используя F5, он сообщает 23353ms.
Вот времена: (все сборки Win32)
- DEBUG, командная строка: 421мс
- DEBUG от IDE: 24,570 мс
- РЕЛИЗ, командная строка: 31мс
- РЕЛИЗ, от 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";
}
3 ответа
Запуск по умолчанию под отладчиком Microsoft (windbg, 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
, Это всегда помогает мне.
Нажатие паузы в VS IDE показывает, что дополнительное время затрачивается в malloc/free. Это привело бы меня к мысли, что поддержка отладки в malloc и свободной реализации MS имеет дополнительную логику, если отладчик подключен. Это объясняет расхождения во времени с консоли и отладчика.
РЕДАКТИРОВАТЬ: Подтверждено с помощью CTRL+F5 против F5 (1047 мс против 9088 мс на моей машине)
Похоже, это может произойти, когда кто-нибудь подключит отладчик. Тем не менее, я просто не могу думать об изменении производительности с 30 мс до 23 000 мс из-за этого, особенно когда кажется, что остальная часть моего кода работает так же быстро, независимо от того, подключен отладчик или нет.