从VS2010 IDE启动时,为什么C#Release 3x速度较慢?

时间:2012-10-09 11:43:11

标签: c# visual-studio-2010 performance release launch

  

可能重复:
  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

为什么???

4 个答案:

答案 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>

enter image description here

有关抑制选项的说明,请参阅此处:

当您在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优化:

  • 通过将其放入app.config
  • 来禁用整个应用程序的JITter
  

[.NET Framework调试控制]
AllowOptimize = 0

  • 您可以通过使用此属性
  • 告诉JITter不要优化指定的方法
  

[MethodImpl(MethodImplOptions.NoOptimization)]

关于方法体。

答案 1 :(得分:3)

F5开始调试,而不是“运行”,即使您正在尝试调试发布版本,它也会在后台加载符号等很多内容。

答案 2 :(得分:2)

使用附加的调试器启动程序总是比没有它时慢得多。

答案 3 :(得分:0)

当您在调试模式下编译代码时,编译器会关闭一些优化,并添加一些额外的指令,以便可以在任何地方放置断点,并且可以单步执行代码。

这将使在调试模式下编译的代码比在发布模式下编译的代码慢。