Смедленно медленный Unique_ptr вызов DTOR при подключении отладчика (MSVC)
-
12-12-2019 - |
Вопрос
struct test_struct
{
test_struct() {}
~test_struct() {}
};
#include <vector>
#include <memory>
#include <cstdio>
int main()
{
printf("ctor begin\n");
{
std::vector<std::unique_ptr<test_struct>> test_vec;
const int count = 100000;
for (auto i = 0; i < count; i++) {
test_vec.emplace_back(new test_struct);
}
printf("dtor begin\n");
}
printf("dtor end\n");
}
.
Я использую VS2010, и обнаружил, что некоторые нелепые проблема производительности.Код выше работает хорошо, как в отладке, так и в стройке (CTRL + F5), но когда отладчик подключен (F5), вызов DTOR для Unique_ptr невыносимо медленный.Машинный код результата довольно оптимизирован, поэтому я не ожидаю, что это проблема компилятора, а не отладчика, но я не знаю, как с этим иметь дело.Мой вопрос
- .
- это проблема, способная воспроизводиться на вашей машине?
- Что такое причина этого поведения?
- есть обходной путь?
Решение
замедление вызвано проверкой памяти, которая возникает всякий раз, когда память свободна.Однако это специальная куча на уровне системы / отладчика и не то, что вы можете управлять из вашей программы.
Есть a a a href="http://preshing.com/20110717/the-windows-hap-is-slow-when-laumped-from-the-debugger" rel="noreferrer"> Отличная статья наВыпуск .Подводя итоги: вы должны установить переменную среды, чтобы отключить ее!
К счастью, вы можете установить переменные среды для конкретной проекта из параметров отладки в настройках проекта для вашего проекта, чтобы переменную среды применяется только к вашей программе.
Я использовал эту упрощенную программу для тестирования:
#include <iostream>
#include <memory>
#include <vector>
int main()
{
std::cout << "ctor begin" << std::endl;
{
std::vector<std::unique_ptr<int>> test_vec;
for (unsigned i = 0; i < 100000; i++)
test_vec.emplace_back(new int);
std::cout << "dtor begin" << std::endl;
}
std::cout << "dtor end" << std::endl;
}
.
, устанавливая _NO_DEBUG_HEAP=1
в качестве переменной среды (либо в системе, которая, которую я не буду рекомендовать, либо через параметры отладки), код работает примерно одинаковое количество времени независимо от того, прикреплен ли отладчик.