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

Kna*_*bax 1 c# performance release launch visual-studio-2010

可能重复:
C#64位版本代码的反汇编视图比32位调试代码长75%?

我有一个非常简单的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)

为什么???

Col*_*ith 6

首先是一些细节......

请注意,.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:

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

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

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

[MethodImpl(MethodImplOptions.NoOptimization)]

在方法体上.