Смедленно медленный Unique_ptr вызов DTOR при подключении отладчика (MSVC)

StackOverflow https://stackoverflow.com//questions/10680005

Вопрос

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 в качестве переменной среды (либо в системе, которая, которую я не буду рекомендовать, либо через параметры отладки), код работает примерно одинаковое количество времени независимо от того, прикреплен ли отладчик.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top