【问题标题】:Launching VS Profiler boosts Application Performance x20?启动 VS Profiler 可提高应用程序性能 x20?
【发布时间】:2011-07-22 00:28:09
【问题描述】:

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

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

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

一位 .Net 实验过的朋友告诉我,分析器优化了线程,并且“不知何故”找到了通过线程锁和瓶颈的方法,但我简直不敢相信。

所以我的问题是:

  1. 究竟发生了什么、如何以及为什么?
  2. 如何让我的代码在本机上表现得像这样?

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

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

定期运行日志:
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
等等。

Profiler 运行日志:
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 建议检查我是否处于调试或发布模式。 我已经完成了。但是@SnowBear 指出有两件事:运行调试版本的软件和在调试器下运行软件 我确保在 Build 和 Execution 中的活动配置都是 RELEASE 是 VS2010。但是,由于我刚刚发疯,我决定直接从 bin/release 中的 exe 文件启动应用程序。瞧……每个过程都需要 1 秒钟。 运行 Profiler 让您退出调试模式(无论您处于发布模式还是调试模式) 这就是让我感到困惑的原因。
感谢所有案件结束。

【问题讨论】:

  • 在没有任何评论的情况下投反对票不是很方便
  • 我不相信。分析器的重点并不是仅仅通过运行它们就可以使您的应用程序更快。您必须实际应用从运行它们中学到的东西来优化您的代码。 如果您希望任何人认真对待您,请发布一个小型重现项目和您正在使用的分析器的名称。(不是我的反对意见;我会坚持看您是否可以证实这一点。 )
  • @Spence : 我的生活真的有更好的事情要做
  • 您确定不是在分析器下以发布模式运行应用程序,在 IDE 下以调试模式运行应用程序吗?
  • @Mika,关于您的最后一次编辑。有两种不同的东西 - 运行调试版本的软件和运行在调试器下的软件

标签: c# .net optimization profiling profiler


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    考虑到问题是关于代码在分析器下运行得更快,具体问题是“1. 究竟发生了什么、如何发生以及为什么?以及 2. 如何使我的代码在本机上表现得像这样?”接受的答案是错误的,因为它根本没有解决分析器,也没有提到加速 20 倍的具体原因。

    究竟发生了什么:

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

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

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

    附言

    有一个问题是这个问题几个月前的重复:How Come when I sampling profile a program and it actually runs faster than not profiling?

    【讨论】:

      【解决方案3】:

      我遇到过很多次...有一个非常简单的解释。分析器不释放对象,因此在分析时不会产生对象释放的成本。

      因此,如果您想提高性能以使其与所分析的性能相匹配,请弄清楚您在哪里实例化所有这些短期对象,然后重构代码。

      我还不知道有什么非常好的方法可以立即找到有问题的代码,但我可以帮助您缩小范围。如果您分析您的代码,打开报告,选择“功能”作为您的当前视图,然后按包含示例排序,您将看到最重要的方法......您的对象实例化的性能问题可能是其中之一具有最多包容性样本的方法。

      【讨论】:

        【解决方案4】:

        如果您在代码中使用线程,Windows 计时器分辨率也是一个原因。

        默认的 windows 计时器分辨率为 15.6 毫秒

        当您使用分析器运行应用程序时,此值设置为 1 毫秒,应用程序运行得更快。看看这个answer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-12
          • 1970-01-01
          相关资源
          最近更新 更多