.pdb文件会减慢发布应用程序的速度吗?

14
如果.dll文件中包含.pdb(程序调试)文件,则在抛出任何异常的堆栈跟踪中会出现行号。这是否会影响应用程序的性能?
这个问题与释放版和调试版即优化无关,是关于拥有.pdb文件的性能影响。每次抛出异常时,.pdb文件是否都会被读取?当装配件加载时,信息是否以某种方式进行缓存?还是在抛出相关异常时首次缓存信息?这会有多大的差异?
2个回答

17
约翰·罗宾斯在他的文章中谈到了这个问题:Do PDB Files Affect Performance?。简单来说,如果您使用 /optimize+ 和 /debug 开关编译发布版本,答案是否定的:

这可能在其他操作系统上是正确的,但在Windows上不是。如果您认为它们会影响性能,那么为什么Microsoft会在调试和发布版本中打开PDB文件以构建他们所发行的每个产品呢?他们编写了编译器,链接器和操作系统,因此对其影响非常清楚。Microsoft拥有比世界上任何其他软件公司都更多专注于性能的人员。如果有任何性能影响,他们不会这样做。总之,性能并非Microsoft唯一关注的问题,而是所有问题。

此外:

当使用 /optimize+ 和 /debug 开关进行构建时,传递一个DebuggingMode.IgnoreSequencePoints到DebuggableAttribute,告诉JIT编译器它不需要加载PDB文件就可以正确地JIT IL代码。

他还有另一篇文章:PDB Files: What Every Developer Must Know,也值得一读。



6

通常情况下不会。PDB(程序数据库)和优化是正交的。无论另一个选项的值如何,都可以启用其中一个。但是,如果您要实际使用包含在PDB中的信息(例如当您访问异常的StackTrace并且需要从PDB获取行号或调用new StackTrace(true)时),它可能会降低性能。

顺便说一下,Eric Lippert有一篇相关博客文章关于编译器优化


你说的“不正常”是什么意思?它何时会产生影响?此外,我看不出拥有PDB并启用优化如何回答这个问题。 - Matt Howells
我提到了一个具体的情况,我认为它可能会影响性能:当您需要在构建堆栈跟踪时从中查找信息时。编译器可以生成相同的IL,无论是否生成PDB,JIT优化器也不关心是否存在PDB以启用其优化。因此,当生成的机器代码相同时,存在PDB并不会降低性能。 - Mehrdad Afshari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接