【问题标题】:opinions on yourkit .NET profiler?对 yourkit .NET 分析器的意见?
【发布时间】:2009-10-05 13:15:49
【问题描述】:

有人在使用 yourkit 制作的 .NET profiler 吗?我正在寻找一个好的 .NET 分析器并偶然发现了 yourkit 。因为我会购买一个单人许可证,所以我要花 79 欧元,恕我直言。我也喜欢:或多或少易于使用和友好的 GUI。

但我在分析 .NET 应用程序方面不是很有经验,所以我想知道 yourkit .NET profiler 是否能完成这项工作。不过,Yourkit 在 Java 世界中似乎非常有名。

有什么意见吗?

【问题讨论】:

  • Eqatec 制作一个免费的 .Net 分析器 (eqatec.com/tools/profiler) 如果成本是一个问题。不过从未尝试过,所以无法评论它有多好。
  • 我试了一下,但是 yourkit profiler 似乎更容易使用。我不介意为软件付费,但是 redgate 的可能最好的分析器(如 Stackoverflow 上的内容)对我来说太贵了。所以少于 100 欧元就可以了。
  • 目前为止最好的 .net 分析器是 Visual Studio 团队系统中的 F1。我已经广泛使用 redgate,并且发现它对于分析任何硬性能问题几乎没有用处。它缺乏有关上下文和线程切换等内容的内核信息,因此难以处理复杂的线程应用程序。
  • 嗯,太糟糕了,我只有VS专业版。不过关于 redgate 的有趣信息。

标签: .net profiler


【解决方案1】:

意见?是的。当您决定购买或不购买哪个分析器时,give this a try

添加:@Max:分步说明:IDE 有一个“暂停”按钮。在 IDE 下运行你的应用程序,当它主观上很慢时,即在你等待它的时候,点击“暂停”按钮。然后获取调用堆栈的快照。

要对调用堆栈进行快照,我要做的是显示它(这是调试窗口之一)。在 IDE 选项中,您可以找到堆栈视图中显示内容的选项。我关闭了显示函数参数的选项,因为这会使行太长。我对发生调用的行号和被调用函数的名称感兴趣。然后,在调用堆栈视图中,您可以执行“全选”,然后执行“复制”,然后将其粘贴到记事本中。我知道这有点笨拙,但我以前是手写的。

我以这种方式采集了一些样本。然后我查看它们是否出现在多个样本上的线条,因为它们是耗时的。有些只是必要的,例如“call main”,但有些则不是。 那些是金块。如果我没有找到任何东西,我会继续取样,最多大约 20 个。如果到那时我仍然没有找到任何东西(非常不寻常),那么程序就很漂亮了优化得很好。 (一个关键点是,每次你这样做程序变得更快,并且在此过程中剩余的性能问题变得相对更大并且更容易找到。即,不仅程序以一定的比率 R 变得更快,而且剩余的问题以相同的比例按百分比变大。)*

我在这个过程中做的另一件事是问自己程序在做什么以及为什么在那个示例中。 “为什么”非常重要,因为这就是你如何判断一条线是否真的需要或者可以用成本更低的东西代替的方式。如果我不确定它为什么在那里,我会单步执行它,也许查看数据,或者让它返回几个级别(shift-F11)直到我明白它在做什么。这就是它的全部内容。

如果现有的分析器实际执行堆栈采样、保留样本、按包含它们的样本百分比对行进行排名,然后让您详细研究单个样本,则它们可以帮助完成此过程。也许他们会在某个时候,但他们现在不会。他们忙于效率和衡量等问题。

*假设您的代码将 90% 的时间花在 X 上,9% 的时间花在 Y 上,两者都不是必需的。取少量样本,你会看到 X,但可能看不到 Y。如果你修复 X,你会得到 10 倍的加速。再次进行采样(您可能必须在程序周围包裹一个外循环,以便您可以采样)。现在您可以确定地看到 Y,因为现在它需要 9% x 10x = 90%。修复它可以让您再获得 10 倍的速度,整体加速 100 倍。

【讨论】:

  • 有人开车送我。这是有争议的证据。这是另一种解释:stackoverflow.com/questions/406760/…
  • 你的方式听起来很有趣,但老实说,我不太清楚如何使用 C# 和 Visual Studio 2008 来做到这一点(简而言之:我还不明白)。对此有任何“分步”说明吗?
  • 现在这是一种有趣的优化/测量方式。从未见过或听到过这样的事情。但这听起来很有趣,我会试试看!感谢您的详尽解释!
  • @Max.别客气。该方法的部分思维定势是,精确测量不一定是找到要优化的东西的先决条件。目标很大而且距离很近。祝你好运。
【解决方案2】:

免责声明:我的建议是基于您认真对待性能分析的假设,并希望找出您的调整工作的准确改进百分比。

根据我使用 ANTS 和 DotTrace 等性能分析器的经验,我认为它们很有用,但有时都会失败。

通用性能分析器的问题是它们增加了太多开销并导致结果不准确。但是,他们确实在寻找繁重的操作方面做得很好。当您使用分析器并发现一个操作占用了总处理时间的 40% 时,它实际上是否占用了 40%?也许不吧。但它可能确实需要很长时间才能运行。

因此,要回答您的问题,您的套件是“优秀”还是“令人满意”并不重要,除非它太糟糕以至于您听到关于它的可怕故事。因为它将让您全面了解应用程序中的性能瓶颈。让您知道在哪里插入您自己的时间记录指令,以了解您的应用程序的实际性能概况。

PS。我还建议您阅读有关performance profiling 的内容,这将使您对这个概念有一个全面的了解,并有助于理解其他人的建议。

【讨论】:

  • @Bill:我建议认真对待性能改进并不需要对要实现的增益进行准确的先验测量,因为它可以后验准确地测量。该方法对性能的影响最小也不重要(见证 ValGrind)。重要的是它能够快速准确地定位问题。 Profiler 还没有这样做(尽管他们可以)。
  • @Mike:我同意快速找到问题很重要。但是我对您的先验/后验论证有点迷茫,您的意思是性能改进是后验知识而不是先验知识吗?在这种情况下,我同意,这就是我的提议。
  • @Bill:例如,假设有一条函数调用指令恰好有 50% 的时间在堆栈上(所以这正是它的成本)。假设您采用 5 个随机堆栈样本。您可以在 0 个样本(非常不可能)、1 个样本(不太可能)、2 个样本(估计为 40%)、3 个(估计为 60%)、4 个(不太可能)或 5 个(非常不可能)上看到它。因此,您可以准确地知道它在哪里,并且修复它最多可以减少 50%,即使您提前不知道它会为您节省多少。这有帮助吗?
  • ... 所以样本并没有准确地衡量问题,但他们确实准确地定位了它。如果您需要更精确地测量加速比,您始终可以在修复它之前/之后对其进行计时。不需要 100 个样本。取样的速度无关紧要。您可以取一个样本并在取另一个样本之前查看一整天 - 它不会影响结果。
  • ... 这么简单的概念竟然被这么少人理解,我完全感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多