继续上一个问题,是否有一个全面的文档列出了C#应用程序中调试和发布模式之间的所有可用差异,特别是在Web应用程序中?
有什么区别?
"Debug"和"Release"只是Visual Studio定义的预定义项目配置的名称.
要查看差异,请查看Visual Studio中"项目属性"中的"生成"选项卡.
VS2005的不同之处包括:
调试配置中定义的DEBUG常量
优化Release配置中启用的代码
以及通过单击"高级"按钮可以看到的其他差异
但是你可以:
在Project Propeties/Build中更改Debug和Release配置的构建设置
右键单击解决方案资源管理器中的解决方案并选择Configuration Manager,创建自己的自定义配置
我认为DEBUG常量的行为相当清楚(可以在#if预处理器指令或ConditionalAttribute中引用).但我不知道有关确切启用哪些优化的全面文档 - 实际上我怀疑微软希望在没有通知的情况下自由地增强优化程序
没有一个文件列出了这些差异.除了已经列出的一些差异之外,在调试模式下进行编译会关闭在运行时执行的大多数JIT编译器优化,并且还会在符号数据库文件(.pdb)中发出更完整的调试信息.
另一个很大的区别是GC行为有些不同,因为JIT编译器会根据需要插入对GC.KeepAlive()的调用以支持调试会话.
我不知道一份简明的文件,但是:
Debug.Write调用在Release中被删除
在发布中,由于优化,您的CallStack可能看起来有点"奇怪",如Scott Hanselman所述
调试和发布只是不同解决方案配置的标签.如果需要,您可以添加其他人.如果您希望可以从配置管理器添加更多配置 -
http://msdn.microsoft.com/en-us/library/kwybya3w.aspx
主要差异 -
1.在调试dll中添加了几个额外的指令,使您能够在Visual Studio中的每个源代码行上设置断点.此外,代码将不会被优化,使您能够调试代码.在发布版本中,这些额外的说明将被删除.
2.PDB文件仅在调试模式下创建,而不是在相关模式下创建.
3.在发布模式下,cpde由内置于JIT编译器的优化器进行优化.它进行了以下优化:
•方法内联 - 方法调用由注入方法的代码替换.
•CPU寄存器分配 - 局部变量和方法参数可以保存在CPU寄存器中,而不会(或不经常)存储回堆栈帧
•数组索引检查消除 - 使用数组时的一个重要优化(所有.NET集合类在内部使用数组).当JIT编译器可以验证循环从不索引数组超出范围时,它将消除索引检查.
• Loop unrolling - Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body. • Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated. • Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop. • Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x
如果您使用任何ASP.NET Ajax控件,那么一个主要的性能区域:在发布版本中运行时,调试信息将从JavaScript库中删除,并且我已经看到复杂页面上的主要性能改进.其他基于Web的资源可以基于此设置进行缓存或不缓存.
此外,请记住,Web应用程序中的调试/发布由web.config
文件决定,而不是Visual Studio中的设置.
更多信息:
不要在启用debug ="true"的情况下运行生产ASP.NET应用程序