继续我的previous question,是否有一份全面的文档列出了C#应用程序中调试和发布模式之间的所有可用差异,特别是在Web应用程序中?
有什么不同?
答案 0 :(得分:48)
“Debug”和“Release”只是Visual Studio定义的预定义项目配置的名称 要查看差异,请查看Visual Studio中“项目属性”中的“生成”选项卡。
VS2005的差异包括:
调试配置中定义的DEBUG常量
优化发布配置中启用的代码
以及点击“高级”按钮
可以看到的其他差异但你可以:
在Project Propeties / Build中更改Debug和Release配置的构建设置
通过右键单击解决方案资源管理器中的解决方案并选择配置管理器
我认为DEBUG常量的行为相当清楚(可以在#if预处理器指令或ConditionalAttribute中引用)。但我不知道有关确切启用哪些优化的全面文档 - 实际上我怀疑微软希望在没有通知的情况下自由地增强其优化器
答案 1 :(得分:15)
没有一个文件列出差异。除了已经列出的一些差异之外,在调试模式下进行编译会关闭在运行时执行的大多数JIT编译器优化,并且还会在符号数据库文件(.pdb)中发出更完整的调试信息。
另一个很大的区别是GC行为有些不同,因为JIT编译器会根据需要插入对GC.KeepAlive()的调用,以支持调试会话。
答案 2 :(得分:13)
我不知道一份简明的文件,但是:
答案 3 :(得分:9)
调试和发布只是不同解决方案配置的标签。如果需要,您可以添加其他人。如果您希望可以从配置管理器添加更多配置 -
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
答案 4 :(得分:5)
如果您正在使用任何ASP.NET Ajax控件,那么一个主要的性能区域:在发布版本中运行时,调试信息将从JavaScript库中删除,并且我已经看到复杂页面上的主要性能改进。其他基于Web的资源可以根据此设置进行缓存或不缓存。
另外,请记住,Web应用程序中的调试/发布由web.config
文件决定,而不是Visual Studio中的设置。
<system.web>
<compilation debug="true">
更多信息:
答案 5 :(得分:4)
使用GDI +绘图在调试模式下要慢得多。
答案 6 :(得分:3)
您还可以管理您希望仅在调试中运行的代码的某些部分,或者仅在具有预处理器标记的版本中运行:
#if DEBUG
// Some code running only in debug
#endif
或
#if NOT DEBUG
// Some code running only in release
#endif
答案 7 :(得分:2)
发布版本:
相当快(最重要),优化
不能(一步一步)
并且不包含用“debug”指令编写的代码
请参阅 What's the difference between a Debug vs Release Build? 。
答案 8 :(得分:1)
我将可执行文件分发到另一台机器时收到错误消息,指示系统错过了MSVCP110D.dll。
此问题的解决方案在Stack Overflow问题 Visual Studio MSVCP110D.dll is missing 中说明。
IN XXXXD.dll D表示DLL文件是DLL文件的调试版本。但MS Visual C ++ Redistributable软件包仅包含DLL文件的发行版本。
这意味着如果您需要分发由Visual C++开发的程序,则需要在发布模式下构建它。并且您还需要安装MS Visual C ++ Redistributable(正确版本)目标机器。
所以我认为这是调试和发布模式之间的关键区别之一。