MSVC2005 std :: _ Iterator_base :: функции работают медленно при отладке - PullRequest
2 голосов
/ 31 августа 2011

Я профилирую код отладочной сборки c ++ в MSVC 2005, и выполнение определенного кода занимает очень много времени (30+ секунд) по сравнению с (1-2 секундами) в выпуске.

Я установил для _SECURE_SCL значение 0 в параметрах компилятора (/ D _SECURE_SCL = 0) и проверил, что он установлен на ноль в источнике.

Я скопировал главных потребителей из профилировщика (AMD CodeAnalyst)

  • std :: _ Iterator_base :: _ Orphan_me 19.74
  • std :: _ Iterator_base :: _ Принять 9.57
  • std :: _ Iterator_base :: operator = 8,98
  • std :: _ Iterator_base :: ~ _Iterator_base 8.55
  • std :: _ Iterator_base :: _ Iterator_base 7.37

Попытка отладки кода и необходимость ждать более 30 секунд каждый раз, когда это отстой, есть что-то, чего мне здесь не хватает?

UPDATE: Обтекание #pragma optimize() вокруг метода класса не принесло особых результатов, но определение /D _HAS_ITERATOR_DEBUGGING=0 привело к снижению скорости его выпуска, теперь это мои главные хиты для профилировщика (это нормально для функции):

  • std :: _ Vector_const_iterator> :: operator ++ 29,79
  • std :: _ Vector_const_iterator> :: operator ++ 26.26
  • std :: _ Vector_const_iterator> :: operator * 25.74

3 функции, 60 инструкций, всего: 2666 сэмплов, 81,78% от показанных сэмплов, 2,76% от всех сессионных сэмплов

Спасибо за быстрые ответы!

Ответы [ 2 ]

4 голосов
/ 31 августа 2011

Вам также следует отключить _HAS_ITERATOR_DEBUGGING, если вы заботитесь о производительности отладки.Когда отладка итератора включена, ведется большая бухгалтерия, чтобы помочь вам обнаружить ошибки в вашем коде, когда вы используете недействительный итератор или не можете правильно управлять временем жизни контейнера и итератора.

При этом 30: 1разница в производительности между проверенной отладочной сборкой и оптимизированной сборкой релиза звучит довольно типично и разумно.

0 голосов
/ 31 августа 2011

Посмотрите на некоторые ответы здесь: Как сделать так, чтобы отладочные сборки MSVC работали быстрее .

В дополнение к _HAS_ITERATOR_DEBUGGING = 0, как упомянуто @James, кажется,есть хитрый трюк, который переключает #pragma optimize("", off) / #pragma optimize("", on), чтобы отключить оптимизацию для отдельных функций / блоков кода и т. д. Если вы хотите отлаживать только внутри определенного фрагмента кода, отключение оптимизации только для этого фрагмента может быть значительно быстрее, чем отключение оптимизации в глобальном масштабе.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...