在许多编译语言中,如C和C++,通常只在一个地方应用优化:当您运行编译器时(尽管对于具有单独的编译器和链接器的旧工具链来说,具有单独的编译时和链接时优化也很常见).
...但在.NET世界中,情况要稍微复杂一些:
csc
C#-to-IL(或VB.NET-to-IL、F#等)编译器可以优化从C#(the /optimize
flag)生成的IL.
if( false ) { /* here */ }
这样的块的内容).当CLR加载构建的.NET程序集(.NET .dll
或.exe
)时,JIT可以应用自己的优化.
DebuggableAttribute( DebuggingModes.DisableOptimizations )
或isJITOptimizerDisabled: false
的装配件-当为using csc.exe
with /debug
时,该属性被添加到装配件.虽然严格地说不是编译器"优化",但当.NET程序运行时,CLR可能会加载缓存的native-image versions个托管程序集,这些程序集特定于您的计算机.
ngen.exe
生成-它(since Windows 8)may在后台抢先编译程序集,而不需要手动运行ngen.exe
.CrossGen2
.readytorun
和/或AOT编译的程序集不是一回事,后者有自己的优化,超出了这个答案的范围.[assembly: Debuggable]
/ DebuggableAttribute
个在Visual Studio中,"禁用托管优化并重新启动调试"实际更改了哪些设置?
消息框允许您更改工具&
然而,我现在担心我已经禁用了一些可能会减慢速度的优化
不要担心:"Suppress JIT optimization..."设置只会在调试时阻止对非项目程序集进行JIT优化--尽管在许多情况下仍将使用ngen‘d映像(因此,除非您使用COMPlus_ZapDisable
,否则仍然运行优化的cod).
这在Visual Studio中更改了哪些设置,以及如何重新启用托管优化?
转到调试器设置并取消选中"取消JIT优化..." Select .
如果您使用调试器模块窗口来查看加载的每个.NET程序集,以及它的JIT优化状态、符号状态,以及VS是否将其视为"用户代码",您就可以看到正在发生的事情.