2009-08-13 85 views
11

如果.pdd(程序调试)文件包含在.dll中,那么行号将出现在引发的任何异常的堆栈跟踪中。这会影响应用程序的性能吗?.pdbs会减慢发布应用程序的速度吗?


这个问题不是关于发布与调试,即优化。它涉及具有.pdb文件的性能影响。每次抛出异常时都会读取.pdb文件?组装程序加载时是否以某种方式缓存信息?还是第一次抛出相关异常时缓存?它有多少差异?

回答

13

约翰罗宾斯在他的文章Do PDB Files Affect Performance?中写道了这件事。简单的答案是否定的(如果使用/ optimize +和/ debug开关编译您的发行版本):

在其他操作系统上可能是这样,但不是Windows。如果你认为他们这样做了,那么为什么微软为构建调试和发布版本而打开PDB文件的每个产品?他们编写了编译器,编写了链接器,并编写了操作系统,以便他们确切知道影响。与世界上任何其他软件公司相比,微软更注重性能。如果有任何性能影响,他们不会这样做。期。性能不是微软唯一的事情,它就是一切。

此外:

当内置/优化+和/调试开关,DebuggingMode.IgnoreSequencePoints传递给DebuggableAttribute告诉JIT编译器,它并不需要加载PDB文件为了正确的JIT IL。

他还有另一篇名为PDB Files: What Every Developer Must Know的文章,这也是一个很好的阅读。

6

不正常。 PDB和优化是正交的。无论其他选项的值如何,都可以启用。但是,如果要实际使用PDB中包含的信息,例如访问StackTrace的例外情况,并且需要从PDB获取行号或拨打new StackTrace(true)时,它可能会降低性能。

顺便说一句,Eric Lippert有一个related blog entry about compiler optimizations

+0

你是什么意思'不正常'?它何时起作用?另外,我没有看到一个人可以拥有PDB并启用优化的事实如何回答这个问题。 – 2009-08-13 09:47:24

+0

我提到了具体的情况,我认为它可能会影响性能:当您在构建堆栈跟踪时需要从中查找信息时。无论是否生成PDB,编译器都可以生成相同的IL,并且JIT优化器也不关心PDB是否存在以启用其优化。因此,当生成的机器码相同时,没有理由存在PDB会降低性能。 – 2009-08-13 09:57:16