2014-01-14 35 views
2

我在C#中有一个应用程序,它连接到数据库并生成一些Excel报告。从Visual Studio运行应用程序的性能恶化

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

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

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

什么能够造成如此巨大的性能差异?

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

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

+1

这是一个调试器,跟踪你的应用程序 – Alberto

+1

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

+1

以'Ctrl + F5'运行时会发生什么? – V4Vendetta

回答

0

从visual studio运行导致大量的调试过程与它一起运行。这使您能够在某些点中断并检查局部变量(以及其他许多事情)。如果您编译发行版本,则随着visual studio在启用优化程序标志的情况下进行编译,改进可能会更加明显。

0

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

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

0

调试可能会减慢执行速度。如果选择“无需调试即可开始”,则性能应与在Visual Studio外执行文件时相同。

一些事情,以避免更相比直接执行文件调试期间减慢执行向下:

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

一些事情,以避免相比,释放建设(不论​​您是否运行在Visual Studio中或直接执行文件)减缓执行下来的调试版本:

  • 使用编译器指令来有条件地包括代码通过,如果条件编译符号DEBUG定义检查(使用#if DEBUG ... #endif
  • 使用在System.Diagnostics.Debug类成员(如使用WriteLine -method很多或使具有所述的缓慢覆盖对象-method)。
  • 即使没有以上应用,调试版本比较慢,因为:

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

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