继续我之前的问题,是否有一份详尽的文档列出了C#应用程序中调试模式和发布模式的所有可用区别,特别是在Web应用程序中?
有哪些差异?
我不知道有一个简洁的文档,但是:
调试和发布只是不同解决方案配置的标签。如果需要,您可以添加其他配置。如果您希望添加更多配置,请使用“配置管理器”。
http://msdn.microsoft.com/en-us/library/kwybya3w.aspx
主要差异:
在调试DLL中,添加了额外的指令,以使您可以在Visual Studio的每个源代码行上设置断点。此外,代码不会被优化,以便您调试代码。 在发布版本中,这些额外的指令被删除。
PDB文件仅在Debug模式下创建,而不是在发布模式下创建。
在发布模式下,代码通过内置于JIT编译器中的优化器进行优化。它进行以下优化:
• 方法内联 - 方法调用被替换为注入方法的代码。
• CPU寄存器分配 - 本地变量和方法参数可以保留在CPU寄存器中,而无需(或更少)存储回堆栈框架
• 数组索引检查消除 - 在使用数组时的一个重要优化(所有.NET集合类都在内部使用数组)。当JIT编译器可以验证循环从不索引数组超出边界时,它将消除索引检查。
• 循环展开 - 短循环(最多4个)具有小体的代码被消除,重复循环体中的代码。
• 无用代码消除 - 类似if(false) { /.../ }的语句会被完全消除。
• 代码提升-循环内部不受循环影响的代码可以移出循环。
• 公共子表达式消除。x = y + 4; z = y + 4;变为z = x
没有一份文件列出了所有的差异。除了已经列出的一些差异之外,在Debug模式下编译会关闭大部分在运行时执行的JIT编译器优化,并且向符号数据库文件(.pdb)发射更完整的调试信息。
另一个重要的区别是,GC行为有所不同,即JIT编译器将插入适当/需要的GC.KeepAlive()调用,以支持调试会话。
如果你使用任何ASP.NET Ajax控件,其中一个主要的性能问题是:在发布时从JavaScript库中删除调试信息,我已经看到复杂页面的主要性能提升。基于这个设置,其他基于Web的资源可能会被缓存或不被缓存。
此外,请记住,Web应用程序中的Debug / Release由web.config
文件决定,而不是您在Visual Studio中的设置。
<system.web>
<compilation debug="true">
更多信息:
您也可以使用预处理器标记管理您想要在调试或发布时运行的某些代码部分:
#if DEBUG
// Some code running only in debug
#endif
#if NOT DEBUG
// Some code running only in release
#endif