可能重复:
Disassembly view of C# 64-bit Release code is 75% longer than 32-bit Debug code?
我有一个非常简单的C#控制台应用程序,帽子对大量元素进行了一些排序(只有几行代码与数组操作)。
当我使用F5或Ctrl-F5从Visual Studio IDE启动发布代码时,该程序比直接从Win-Explorer启动时慢大约3倍。
41.140 seconds when launched from VS 2010 IDE
13.950 seconds when launched by double-clicking myprogram.exe
为什么???
答案 0 :(得分:6)
首先是一些细节...
请注意,.NET中有两个主要的“优化”阶段。
在C#编译器级别生成不同的IL(中间语言)...优化或非优化....由您的项目是否设置是DEBUG
标志
在JITer级别
...当IL被翻译成机器代码时(通过即时编译或通过NGEN)....优化的机器代码可能或者可能没有生产
注意:它不是通过编译器在DEBUG或RELEASE模式下生成的IL来控制JITter优化设置......它是一个独立的设置。
主要优化“胜利”发生在JIT级别。
当您通过Visual Studio调试.NET程序时,通常您不希望JITter生成优化的机器代码,因为当您单步执行时,程序源语句与执行代码并不紧密同步。
这就是为什么Visual Studio中有一个选项可以关闭JITter优化(这与使用AllowOptimize=0
标志关闭JITter优化相当)...并且默认情况下Visual Studio会关闭JITter优化:< / p>
有关抑制选项的说明,请参阅此处:
当您在Visual Studio外部运行.NET应用程序时,该程序是否编译为DEBUG(非优化IL)或RELEASE(优化IL)并不重要.... JITter默认会生成优化的机器代码
因此要注意的行为是.NET程序将运行 在Visual Studio之外启动时比在什么时候快得多 由于不同的JITter优化,从Visual Studio开始 设置...即使它是一个RELEASE模式应用程序....作为@Knasterbax 观测到的。此外,在调试(F5)时添加额外的开销,而不是从Visual Studio运行(CTRL + F5)。
如果您从资源管理器运行您的应用程序(无论是RELEASE还是DEBUG),然后使用Visual Studio“附加”到该进程,那么您的应用程序将使用正在应用优化的JITter ....您的代码将运行得更快...但是任何源代码步进都不会同步。
如果取消勾选“抑制JIT优化”,那么您可以在Visual Studio中以较差的调试体验为代价获得更快的执行速度。
最后,如果您需要/想要,有一种方法可以关闭应用程序代码的JITter优化:
[.NET Framework调试控制]
AllowOptimize = 0
[MethodImpl(MethodImplOptions.NoOptimization)]
关于方法体。
答案 1 :(得分:3)
F5开始调试,而不是“运行”,即使您正在尝试调试发布版本,它也会在后台加载符号等很多内容。
答案 2 :(得分:2)
使用附加的调试器启动程序总是比没有它时慢得多。
答案 3 :(得分:0)
当您在调试模式下编译代码时,编译器会关闭一些优化,并添加一些额外的指令,以便可以在任何地方放置断点,并且可以单步执行代码。
这将使在调试模式下编译的代码比在发布模式下编译的代码慢。