【问题标题】:Application's performance deteriorates when running it from Visual Studio从 Visual Studio 运行应用程序时,应用程序的性能会下降
【发布时间】:2014-01-14 11:21:17
【问题描述】:

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

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

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

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

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

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

我使用的是 Visual Studio 2008 C# Express Edition。

【问题讨论】:

  • 它是跟踪您的应用程序的调试器
  • 它可能是 VS 中附加的调试器。
  • 当你以Ctrl + F5运行时会发生什么
  • @V4Vendetta 当我使用 Ctrl-F5 执行此操作时,时间等于 33224。

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


【解决方案1】:

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 很多(读取:数千)次,它可能会在连接到调试器时减慢您的应用程序。

【讨论】:

    【解决方案2】:

    从 Visual Studio 运行会导致大量调试过程随之运行。这使您能够在某些点中断并检查局部变量(以及许多其他内容)。如果您编译发布版本,改进可能会被标记为 Visual Studio,然后在启用优化器标志的情况下进行编译。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        调试会大大降低执行速度。如果选择“不调试就开始”,性能应该与在 Visual Studio 之外执行文件时相同。

        与直接执行文件相比,在调试期间需要避免的一些事情会导致执行速度更慢

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2019-09-06
          • 2015-04-22
          • 1970-01-01
          • 2014-09-17
          • 1970-01-01
          • 2013-12-12
          • 1970-01-01
          • 2012-06-22
          • 2020-02-24
          相关资源
          最近更新 更多