Вопрос по c++, performance, visual-c++ – Как сделать так, чтобы отладочные сборки MSVC работали быстрее

10

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

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

Установите переменную среды _NO_DEBUG_HEAP = 1, чтобы использовать обычную кучу, а не кучу отладки. Stephen Nutt
В прошлом мне говорили, что все вопросы должны быть «вики сообщества». Я действительно не знаю, что делает эта опция. pauldoo
Вам следует задавать вопросы только в "вики сообщества" когда они ориентированы на сообщество, например "Какой лучший foobar?" Когда вы отмечаете это вики сообщества, вы не получаете репутацию из этого. Erik Funkenbusch
почему это вики сообщества? Aamir
............лол demoncodemonkey

Ваш Ответ

8   ответов
12

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

Работает хорошо, если в нем всего несколько файлов, в которых вам нужно найти ошибку.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded#pragma optimize("", off)Error: User Rate Limit Exceeded#pragma optimize("", on)Error: User Rate Limit Exceeded pauldoo
3

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

Error: User Rate Limit Exceeded
1

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

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

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

4

_HAS_ITERATOR_DEBUGGING=0
_SCL_SECURE=0

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

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

Error: User Rate Limit Exceededstackoverflow.com/questions/375913/…
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

и я чувствовал такую же медлительность при отладке на старшей машине на & gt; Проект 500k LOC. Оказывается, база Intellisense была повреждена и постоянно обновлялась, но где-то зависала. Удаление файла .ncb решило проблему.

2

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

1

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

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

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

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

январь

4

ии релиза?

Error: User Rate Limit Exceeded pauldoo

Похожие вопросы