Do.pdbs замедляют выпускное приложение?

Если файл .pdb(program debug) включен в .dll, то строки строк отображаются в трассировке стека любого брошенного исключения. Это влияет на производительность приложения?


Этот вопрос не касается выпуска и отладки, т.е. оптимизации. Речь идет о последствиях производительности наличия файлов .pdb. Проверяются ли файлы .pdb каждый раз, когда генерируется исключение? Является ли информация кэширована каким-то образом при загрузке сборок? Или он кэшируется в первый раз, когда выбрано соответствующее исключение? Какая разница?

Ответ 1

Джон Роббинс написал об этом в своей статье Влияют ли файлы PDB на производительность?. Простой ответ - нет (если вы скомпилируете сборку выпуска с помощью переключателей /optimize + и /debug ):

Это может быть правдой для других операционных систем, но не для Windows. Если вы думаете, что они делают, то почему Microsoft строит каждый отдельный продукт, который они отправляют с включенными файлами PDB для сборки отладки и выпуска? Они написали компилятор, они написали компоновщик, и они написали операционную систему, чтобы они точно знали, что такое эффекты. У Microsoft больше людей сосредоточено на производительности, чем на любой другой софтверной компании в мире. Если бы было какое-то влияние на производительность, они бы этого не сделали. Период. Производительность - это не единственное в Microsoft, все.

Дополнительно:

Когда вы создаете/оптимизируете + и/отладочный коммутатор, DebuggingMode.IgnoreSequencePoints передается в DebuggableAttribute, чтобы сообщить компилятору JIT, что ему не нужно загружать файл PDB, чтобы правильно JIT IL.

У него также есть еще одна статья под названием Файлы PDB: что каждый разработчик должен знать, который также хорошо читается.

Ответ 2

Не нормально. PDB и оптимизация ортогональны. Можно включить, независимо от значения другого параметра. Тем не менее, это может снизить производительность, если вы хотите фактически использовать информацию, содержащуюся в PDB, например, когда вы обращаетесь к StackTrace исключения, и ему нужно получить номера строк из PDB или когда вы вызываете new StackTrace(true).

Кстати, у Эрика Липперта есть связанная запись в блоге о оптимизации компилятора.