启动VS Profiler可提升应用程序性能x20?

编辑1
我根本不排除这可能是由于使用Profiler的一些非常基本的副作用(我的“常规”项目中的一些错误设置)

我想在我的应用程序中改进计算时间,所以我决定进行彻底的分析分析。 所以我刚刚启动了.Net内存分配配置文件来分析我的应用程序。
我完全惊呆了,观看计算速度快了20倍

应用程序包括从带有BackgroundWorkers的二进制文件中读取数据,处理它们,
并将结果存储到MSSQL DB中。 每轮通常需要20秒,而分析它几乎需要1秒。 我检查并确保两种情况下结果一致。

一个.Net实验的朋友告诉我,探查器优化了线程并“以某种方式”找到了通过线程锁和瓶颈的方式,但我简直不敢相信。

所以我的问题是:

  1. 究竟发生了什么,现在和为什么?
  2. 如何使我的代码本机行为?

编辑2
知道这听起来很疯狂,令人难以置信。 我自己仍然非常怀疑。但它是真的。
在分析器运行时,SAME代码运行得非常快。 我使用SAME测试数据,并观察SAME计算输出。 我无法给出一个简单的复制项目,因为它是一个相对较大的框架。 我正在使用Visual Studio 2010 Profiler。

我将尽可能多地提供关于流程的详细信息,一旦找到它,我肯定会发布一条线索。

定期运行日志:
03/23/2011 18:04:34 | 180434.621 | 模拟集[5] – [1] – [5 PC-1 0 [SET 1/48]
03/23/2011 18:05:01 | 180501.271 | 处理时间:00:00:26.6515244
等等..

Profiler运行LOGS:
03/24/2011 11:38:15 | 113815.592 | 模拟集[5] – [1] – [5 PC-1 0 [SET 1/48]
03/24/2011 11:38:17 | 113817.350 | 处理时间:00:00:01.7581005

等等..

编辑3:线索
好的确定我的坏(我在编辑1上警告这种可能性,因为这太令人难以置信了。抱歉)@Watts建议检查我是否处于调试或发布模式。 我已经做过了。 但@SnowBear指出有两个不同的东西:运行调试版软件和在调试器下运行软件我确保在Build and Execution中的活动配置是RELEASE是VS2010。 但是,由于我刚刚疯狂,我决定直接从bin / release中的exe文件启动应用程序。 而且……过程每个过程需要1秒钟。 运行Profiler会使您退出调试模式(无论您处于发布模式还是调试模式),这让我感到困惑。
感谢All Case Closed。

使用调试器运行会禁用jit优化。 如果你运行exe,通常会启用jit优化。 将调试器附加到这样一个正在运行的应用程序允许您使用启用的优化进行调试。

Release-Build vs Debug-Build有两个结果:

  1. 条件编译器符号是(未)定义的
  2. 它启用/禁用C#=> IL编译中的优化。

考虑到问题是关于代码在探查器下运行得更快,并且具体问题是“1.究竟是什么,现在和为什么?以及2.如何让我的代码本身表现得那样?” 接受的答案是错误的,因为它根本不涉及分析器,也没有提到20倍加速的具体原因。

究竟发生了什么:

在项目属性的“调试”选项卡中,选中“启用非托管代码调试”复选框; 此选项会导致调试器像糖蜜一样慢。

运行探查器时,它仍然是您正在分析的程序的调试版本,因此定义了“DEBUG”符号,并且启用了所有跟踪,断言等,但不涉及调试器,因此“启用非托管代码调试”选项不适用。 (在进行性能分析时可能会启用JIT优化,但这不会导致性能提升2倍,更不用说提升20倍了。)

如果您想在调试代码时享受这20倍的提升(不仅在分析时),请转到项目属性的“调试”选项卡,并确保未选中“启用非托管代码调试”。

PS

有一个问题是这个问题的几个月前的重复: 当我对一个程序进行抽样时它是如何实现的,它实际上运行得比没有分析更快?

我经历了很多次……对此有一个非常简单的解释。 分析器不处理对象,因此分析时不会产生对象处理的成本。

因此,如果要提高性能以使其与分析的性能相匹配,请找出实例化所有这些短期对象的位置,并重构代码。

我还不知道一个非常好的方法来立即找到有问题的代码,但我可以帮助你缩小范围。 如果您对代码进行了分析,请打开报告,选择“function”作为当前视图,然后按包含样本排序,您将看到顶级方法…对象实例化的性能问题很可能出现在其中一个包含最多样本的方法。