Kna*_*bax 1 c# performance release launch visual-studio-2010
我有一个非常简单的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
Run Code Online (Sandbox Code Playgroud)
为什么???
首先是一些细节......
请注意,.NET中有两个主要的"优化"阶段.
在C#编译器级别
...生成不同的IL(中间语言)...优化或非优化....由您的项目是否设置DEBUG
标志控制
在JITer级别
......当IL被翻译成机器代码时(通过即时编译或通过NGEN)....优化的机器代码可能会或可能不会产生
注意:它不是IL产生的DEBUG或RELEASE模式下的编译器控制JITter优化设置......它是一个独立的设置.
主要优化"胜利"发生在JIT级别.
当您通过Visual Studio调试.NET程序时,通常您不希望JITter生成优化的机器代码,因为当您单步执行时,程序源语句与执行代码并不紧密同步.
这就是为什么Visual Studio中有一个选项可以关闭JITter优化(这与使用AllowOptimize=0
标志关闭JITter优化相当)......默认情况下,Visual Studio会关闭JITter优化:
有关"抑制"选项的说明,请参阅此处:
当您在Visual Studio外部运行.NET应用程序时,无论该程序是编译为DEBUG(非优化IL)还是RELEASE(优化IL)都无关紧要.... JITter默认会生成优化的机器代码.
因此,需要注意的是,由于不同的JITter优化设置,在Visual Studio外部启动时,.NET程序运行速度要比从Visual Studio启动时快得多...即使它是一个RELEASE模式应用程序....作为@ Knasterbax观察到.此外,在调试(F5)时添加额外的开销,而不是从Visual Studio运行(CTRL + F5).
如果您从资源管理器运行您的应用程序(无论是RELEASE还是DEBUG),然后使用Visual Studio"附加"到该进程,那么您的应用程序将使用正在应用优化的JITter ....您的代码将运行得更快...但任何源代码步进都不会同步.
如果取消勾选"抑制JIT优化",那么可以在Visual Studio中以较差的调试体验为代价获得更快的执行速度.
最后,如果您需要/想要,有一种方法可以为您的应用程序代码关闭JITter Optimizations:
[.NET Framework调试控件]
AllowOptimize = 0
[MethodImpl(MethodImplOptions.NoOptimization)]
在方法体上.