从Visual Studio运行时,应用程序的性能会下降

时间:2014-01-14 11:21:18

标签: c# performance visual-studio visual-studio-2008

我在C#中有一个应用程序,它连接到数据库并生成一些Excel报告。

当我在调试模式下在Visual Studio中运行应用程序时,此操作需要大约。 101736毫秒。

当我打开 bin \ Debug 文件夹并从那里运行可执行文件时,相同的进程(相同的数据库,相同的参数)需要33135毫秒。

但我正在运行相同的程序。

什么可能导致如此巨大的性能差异?

我已经多次这样做了,从Visual Studio运行应用程序总是比从Windows资源管理器运行可执行文件慢得多。

我正在使用Visual Studio 2008 C#Express Edition。

4 个答案:

答案 0 :(得分:3)

Visual Studio调试器减速的主要原因如下:

  1. 大量P / Invoke调用。启用P / Invoke MDA时大约慢100倍(即使没有设置断点,连接调试器的情况也是如此)。对于每个P / Invoke方法调用,开销是固定的,因此如果单个P / Invoke执行速度很慢,那么您将不会注意到差异,但如果您的方法执行类似return a+b;的操作并且调用了数百个成千上万次,你会受到重创。
  2. 跟踪点和/或条件断点。这些只是在实际受到攻击时才会很慢。跟踪点很难“隐藏”,因为您可以看到它们的输出,但我已经看到条件断点被执行数百万次导致调试器执行速度非常慢的情况。
    • 注意:常规(无条件)断点非常快,调试器几乎没有开销。
  3. 启用了IntelliTrace呼叫跟踪模式(适用于Visual Studio 2010及更高版本的Ultimate Edition)。 IntelliTrace有两个设置:事件模式很快但呼叫跟踪模式可能会带来很大的开销。
  4. 大量异常被抛出。如果您的应用程序抛出了数千个异常,那么您可能会看到调试器速度减慢。
  5. 跟踪和/或调试输出。如果您的应用程序正在调用Debug.WriteLineTrace.WriteLine多次(读取数千次),则可能会降低您的应用程序关闭速度到调试器。

答案 1 :(得分:0)

从visual studio运行会导致大量调试过程随之运行。这使您可以在某些点处中断并检查局部变量(以及许多其他事物)。如果你编译一个发布版本,那么改进可能会更加明显,因为visual studio会在启用优化器标志的情况下进行编译。

答案 2 :(得分:0)

它可能是VS中附加的调试器。

如果你有很多控制台输出或第一次机会异常,你会得到相当大的减速。

答案 3 :(得分:0)

调试可以减慢执行速度。如果选择“Start Without Debugging”,则性能应与在Visual Studio外部执行文件时的性能相同。

与直接执行文件相比,有些事情要避免在执行调试期间使执行速度降低

  • 有条件的断点(它们会导致评估条件)
  • 例外
  • 指定要加载的外部符号
  • 仅在附加调试器时运行的代码(使用if (Debugger.IsAttached) { ... }

与发布版本相比,要避免的一些事情会减慢调试版本中的执行速度(无论您是在Visual Studio中运行还是直接执行文件):

  • 使用编译器指令通过检查是否定义条件编译符号DEBUG来有条件地包含代码(使用#if DEBUG ... #endif
  • 使用System.Diagnostics.Debug类中的成员(例如使用WriteLine - 方法或传递ToString方法覆盖速度较慢的对象)。
  • 即使以上都不适用,调试版本也会变慢,因为:

请注意,我的答案假设默认配置正在使用中。(例如,可以禁用发布版本的代码优化,并为调试版本启用代码优化)。