Как сделать так, чтобы отладочные сборки MSVC работали быстрее - PullRequest
10 голосов
/ 24 июня 2009

У нас есть большое приложение на C ++, которое иногда нам нужно запускать как отладочную сборку, чтобы исследовать ошибки. Сборка отладки намного медленнее, чем сборка релиза, до такой степени, что она практически непригодна.

Какие приемы доступны для ускорения выполнения сборок MSVC Debug без ущерба для отладки?

Ответы [ 8 ]

12 голосов
/ 05 ноября 2009

Используйте #pragma optimize("", off) вверху выбранных файлов, которые вы хотите отладить в выпуске. Это дает лучшую трассировку стека / представление переменных.

Хорошо работает, если нужно всего несколько файлов, чтобы отследить ошибку.

4 голосов
/ 24 июня 2009

Мы отключили отладку итератора с символами препроцессора:

_HAS_ITERATOR_DEBUGGING=0
_SCL_SECURE=0

Это немного помогло, но было не так быстро, как хотелось бы. Мы также сделали нашу отладочную сборку более похожей на релиз, определив NDEBUG вместо _DEBUG. Была пара других опций, которые мы тоже изменили, но я их не помню.

К сожалению, нам нужно было сделать все это, но наше приложение имеет определенный объем работы, который необходимо выполнять каждые 50 мсек, или его невозможно использовать. VS2008 из коробки даст нам ~ 60мс раз для отладки и ~ 6мс раз для выпуска. С упомянутыми выше настройками мы можем получить отладку до ~ 20 мс или около того, что по крайней мере пригодно для использования.

4 голосов
/ 24 июня 2009

Почему бы вам просто не включить отладочную информацию в конфигурации релиза?

3 голосов
/ 24 июня 2009

профилируйте приложение и посмотрите, сколько времени уйдет. После этого вы сможете увидеть, какую отладку нужно настроить.

2 голосов
/ 25 июня 2009

Создайте ReleaseWithSymbols конфигурацию, которая определяет NDEBUG и не включает оптимизацию. Это даст вам лучшую производительность при сохранении точных символов для отладки.

1 голос
/ 24 июня 2009

Вы используете MFC?

По моему опыту, главное, что может замедлить отладочную версию, - это процедуры проверки классов, которые обычно отключаются в выпуске. Если структура данных вообще древовидная, она может в итоге повторно проверять поддеревья сотни раз.

Несмотря на это, если, скажем, в 10 раз медленнее, чем сборка релиза, это означает, что он тратит 1/10 своего времени на то, что необходимо, и 9/10 на что-то другое. Если, пока вы ждете этого, вы просто нажмете кнопку «пауза» и посмотрите на стек вызовов, скорее всего, 9/10, что вы точно увидите, в чем проблема.

Это быстрый и грязный, но эффективный способ найти проблемы с производительностью.

1 голос
/ 24 июня 2009

Существует несколько различий между сборками отладки и сборками выпуска, которые влияют как на отлаживаемость, так и на скорость. Наиболее важными являются определение _DEBUG / NDEBUG, оптимизация компилятора и создание отладочной информации.

Возможно, вы захотите создать третью конфигурацию решения и поиграться с этими настройками. Например, добавление отладочной информации в сборку выпуска на самом деле не снижает производительность, но вы уже получаете разумную трассировку стека, чтобы знать, в какой функции вы находитесь. Только информация строки не является надежной из-за оптимизации компилятора.

Если вам нужна надежная информация о линии, включите и выключите оптимизацию. Это немного замедлит выполнение, но все равно будет быстрее обычной отладки, пока определение _DEBUG еще не установлено. Тогда вы можете сделать довольно хорошую отладку, только все, что имеет "#ifdef _DEBUG" или подобное вокруг него, не будет (например, призывы к утверждению и т. Д.).

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

Jan

0 голосов
/ 24 июня 2009

Какую VS вы используете? Мы недавно перешли с VS.net на VS2008, и я испытал ту же медлительность при отладке на высокопроизводительной машине в проекте> 500k LOC. Оказывается, база Intellisense была повреждена и постоянно обновлялась, но где-то зависала. Удаление файла .ncb решило проблему.

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