【问题标题】:Finding bottlenecks in application寻找应用中的瓶颈
【发布时间】:2011-04-02 03:11:09
【问题描述】:

我有一个 .NET 应用程序,它可以快速运行大约 2000 条记录,而这些记录开始变得非常缓慢。我试图找到瓶颈,我想知道是否有一个好的,可能是免费的,但不一定是,工具或找到瓶颈的方法。我正在尝试查找尚未清除但尚未看到的列表。我有 VS 2008。

【问题讨论】:

  • 您可能想看看 WinDbg 和 SoS - windbg.dumpanalysis.org 您可以在应用程序变慢时对其进行内存转储并分析它是否有未释放的资源
  • 有代码可以发吗?
  • 尝试我之前回答的这个问题中详述的一些步骤:Profiling and optimisation
  • 你有什么版本的 Visual Studio?在 VS2008 Development/Suite 版本中,有一个用于本地和托管代码的内置分析器(披露:我在构建它的团队中)。

标签: c# .net visual-studio-2008 profiling


【解决方案1】:

您可能想开始运行一些 performance counters 来监控 CPU 使用率和内存统计信息并找出发生了什么。

如果这不能让您得到任何明显的答案,那么是时候开始分析了。

JetBrains dotTrace 有 30 天的免费试用期。这是一个相当不错的内存和性能分析器,您可能想看看。

微软的CLR Profiler是免费的。

如果您仍然一无所获,那么是时候大显身手了:WinDbg。如果您走到这一步,您会发现Tess' blog 非常有帮助。

【讨论】:

【解决方案2】:

有一个很好的免费工具,你已经拥有了。唯一的缺点是它可能不直观。

当程序运行缓慢时,在 IDE 下暂停它。检查调用堆栈。 (我关闭了参数的显示;我只对特定的代码行感兴趣。我将整个堆栈复制到文本编辑器,如记事本。)这样做几次。速度越慢,您在发现问题之前需要的样本就越少。

如果您看到一个或多个可疑的流行说法,例如它们出现在健康的样本中(至少两个),您应该注意这些。我所做的就是多采集一些样本,直到它们出现,因为我想了解它们被执行的原因。这很重要,因为如果我可以用花费更少时间的东西来替换它们,我会节省很大一部分。

我将尝试解释它为什么有效。 首先,“瓶颈”的普遍概念具有严重的误导性。 软件并不慢,因为它有限制或“热”的地方。 当然它可能有缓存未命中等,但主要原因是 缓慢是因为它做的比它需要的要多——通常是很多

它在疯狂的嵌套函数调用垃圾箱上消失, 理由越来越遥远。 这显示为一个比必要的更密集的调用树。 您所要做的就是找到可以修剪的大树枝。 这就是暂停技术的作用。

因此,当您四处寻找可以帮助您扮演侦探角色以找到难以捉摸的“瓶颈”的工具时,请成为一名树木外科医生,并修剪您可以从呼叫树中找到的最重的树枝(通过暂停找到),并且继续做,直到你做不到为止。

怀疑是好事,但您可能会惊讶于它的效果。

【讨论】:

  • 或者,您可以使用分析器来记录每个线程的调用树,其中包含许多您无法从 IDE 获得的有用统计信息。
  • @Winston:不要争论,但它不会记录你的调用树(这是不可能的),它会为你提供大量统计数据,但它们通常不会指向你在问题上。最好的分析器 (IMO) 是例如 Zoom,它对调用堆栈进行采样(在挂钟时间)并告诉您每行(而不是每个函数)包含该行的堆栈样本的百分比。 “自用时间”、通话次数、平均通话时长,是常见的统计数据,没有用,调用图也是如此:stackoverflow.com/questions/1777556/alternatives-to-gprof/…
【解决方案3】:

来自 Adam Calderon 的This page 链接到一些关于分析的 MSDN 博客页面。

但是,其中大多数(如果不是全部)似乎与 Visual Studio Team System 有关。因此,如果您可以访问该版本的软件,您将“免费”获得一些工具。

【讨论】:

  • 好伤心。我刚读到 (blogs.msdn.com/b/ianhu/archive/2007/09/14/…) 如果你想成为一家价值千兆的公司,就向人们出售他们认为他们想要的东西,而不是有效的东西。他们的“热点路径”是基于这样的想法,即您正在寻找的是 CPU 花费大量时间的地方(热点,或独占成本高的地方)。它完全忽略了不合理的中间调用站点,并且对 I/O 视而不见。他们应该使用真正的应用程序(大量低级 I/O、大数据结构)。 Mandelbrot 是一个没有代表性的玩具。
【解决方案4】:

DevPartner for C++ 我的 MicroFocus(以前的 Compuware)有一个性能分析器,性能还不错。 英特尔制造的 V-Tune 做同样的事情。 (我认为是英特尔......我从未使用过它)。 我最喜欢的是 Visual Studio Team Edition 附带的那个。这很棒。 您还应该检测自己的代码,并编写自动化测试,以便将一个构建与下一个构建进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多