【发布时间】:2009-08-13 09:31:34
【问题描述】:
如果 .dll 包含 .pdb(程序调试)文件,则行号会出现在任何抛出异常的堆栈跟踪中。这会影响应用程序的性能吗?
这个问题不是关于发布与调试,即优化。这是关于拥有 .pdb 文件的性能影响。每次抛出异常时都会读取 .pdb 文件吗?加载程序集时是否以某种方式缓存了信息?还是第一次抛出相关异常时缓存?有多大区别?
【问题讨论】:
标签: c# .net performance
如果 .dll 包含 .pdb(程序调试)文件,则行号会出现在任何抛出异常的堆栈跟踪中。这会影响应用程序的性能吗?
这个问题不是关于发布与调试,即优化。这是关于拥有 .pdb 文件的性能影响。每次抛出异常时都会读取 .pdb 文件吗?加载程序集时是否以某种方式缓存了信息?还是第一次抛出相关异常时缓存?有多大区别?
【问题讨论】:
标签: c# .net performance
John Robbins 在他的文章Do PDB Files Affect Performance? 中写到了这一点。简单的答案是否定的(如果您使用 /optimize+ 和 /debug 开关编译发布版本):
在其他操作系统上可能是这样,但在 Windows 上则不然。如果您认为他们这样做,那么为什么 Microsoft 会构建他们附带的每个产品,并为调试和发布版本打开 PDB 文件?他们编写了编译器,编写了链接器,编写了操作系统,因此他们确切地知道效果是什么。与世界上任何其他软件公司相比,微软拥有更多关注性能的人。如果对性能有任何影响,他们就不会这样做。时期。在 Microsoft,性能不是唯一的事情,而是一切。
另外:
当构建 /optimize+ 和 /debug 开关时,将 DebuggingMode.IgnoreSequencePoints 传递给 DebuggableAttribute 以告诉 JIT 编译器它不需要加载 PDB 文件即可正确 JIT IL。
他还有一篇题为PDB Files: What Every Developer Must Know的文章也不错。
【讨论】:
不正常。 PDB 和优化是正交的。无论另一个选项的值如何,都可以启用一个。但是,如果您想实际使用 PDB 中包含的信息,例如当您访问异常的 StackTrace 并且它需要从 PDB 获取行号或调用 new StackTrace(true) 时,它可能会降低性能。
顺便说一句,Eric Lippert 有一个related blog entry about compiler optimizations。
【讨论】: