c# - 启动 VS Profiler 可将应用程序性能提高 20 倍?

标签 c# .net optimization profiling profiler

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

我想改进应用程序的计算时间,因此我决定进行彻底的概要分析。 因此,我刚刚启动了 .Net 内存分配分析 来分析我的应用程序。
看到计算速度快了 20 倍,我完全惊呆了!

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

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

所以我的问题是:

  1. 究竟会发生什么、如何发生以及为什么发生?
  2. 如何使我的代码在本地表现得像那样?

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

我会尽可能多地提供有关流程的详细信息,并且肯定会在找到线索后立即发布。

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

探查器运行日志:
2011 年 3 月 24 日 11:38:15 | 113815.592 |模拟集 [5]-[1]-[5 PC-1 0 [SET 1/48]
2011 年 3 月 24 日 11:38:17 | 113817.350 | 处理时间:00:00:01.7581005

等..

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

最佳答案

使用调试器运行会禁用 jit 优化。如果您正常运行 exe,将启用 jit 优化。将调试器附加到此类正在运行的应用程序允许您使用启用的优化对其进行调试。

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

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

关于c# - 启动 VS Profiler 可将应用程序性能提高 20 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5417663/

相关文章:

c# - 比较时间而不考虑日期

c# - 从对象初始值设定项访问属性

actionscript-3 - Actionscript 3 导入 package.* 与导入 package.Class

mysql - 索引中的漏洞是否会以某种方式影响数据库?

c# - 我如何重构这些函数以促进代码重用?

c# - gRPC(.net 核心实现)可以消费 WCF 服务吗?

c# - 只捕获表格一部分的屏幕截图?

c# - 如何在 ASP.NET Core Identity 中使用角色 GUID 而不是名称?

c# - WPF CompositeCollection按每个 Collection View 分组

c# - 找不到类型或 namespace 名称 'register'