32

这可能是一个边缘广告,更不用说主观了,但问题是诚实的。在过去的两个月里,我一直在为 .NET 开发一个新的开源分析器,称为 SlimTune Profiler ( http://code.google.com/p/slimtune/ )。

这是一项相对较新的工作,但是当我查看可用的分析器范围时,我并没有留下深刻的印象。我已经在现有产品的基础上做了一些初步工作,但我觉得这是一个很好的地方问:你到底想从分析器中得到什么?

我来自实时图形和游戏,所以对我来说,尽可能快的分析器很重要。否则,游戏将变得无法玩,并且分析无法玩的慢速游戏往往不是很有启发性。因此,我愿意牺牲一些准确性。我什至不在乎异常。但我不太熟悉其他类型应用程序的开发人员对什么感兴趣。有什么适合您的功能吗?现有工具在哪里失败?

再次,如果这只是 StackOverflow 的基础,我深表歉意,但它对我来说一直是一个非常有用的资源,并且这里有非常广泛的开发人员。

4

14 回答 14

17

我的要求:

  • 在不影响应用程序的情况下收集统计信息 - 例如,不要填满内存,允许从有问题的应用程序中收集数据
  • 能够简单且可重复地指定测量值(数据驱动)
  • 可自动化,因此我可以重复测量,无需点击,无需 UI
  • 使我们能够了解与 WPF 和其他声明性技术(如 DLR 或 WF)相关的问题
  • 无需安装 - 无需 gac、msi 等,如果可以通过网络运行就更好了
  • 从一开始就支持 64 位
  • 不要试图了解所有可以完成的分析——鼓励一个生态系统。如果可以使用其他工具分析原始统计数据就更好了。
  • UI 如果有的话应该是好的——但它的统计数据很重要。所以不要花时间在上面,好好分析一下核心。
    • 支持对不是直接 exe 的应用程序进行分析,例如服务和 Web 应用程序。

会喜欢:

  • 考虑跨应用程序支持 - 大型应用程序通常需要了解许多可执行文件的应用程序性能行为。如果您的分析器允许轻松关联这些数据,那就更好了
于 2009-08-13T23:13:05.817 回答
11

我的收藏:

  • 非常易于使用 - 简单(但功能强大)的 GUI
  • 出色的性能- 能够分析使用率极高的应用程序。
  • X64X32支持
  • 了解 SQL,能够为我的所有 SQL 调用提供堆栈跟踪和持续时间,以及 SQL。
  • 易于分析,无需经过复杂的重新编译应用程序过程。
  • 易于分析作为副作用启动的服务、网站和流程
  • 一种“生产模式”,允许您从基于生产的系统中收集关键统计数据。
    • “自动瓶颈查找器”:针对生产应用程序运行并使用启发式方法确定哪些方法较慢。
  • 每个线程分析,告诉我哪些线程正在做所有的工作以及在哪里。
  • 各种粒度的配置文件,允许执行仅收集关键信息并通过粒度分析进行挖掘的“廉价”配置文件。
  • 异常跟踪器,允许我跟踪我的应用程序中抛出的所有异常(关键统计信息和详细信息)
  • 每个线程分析 - 允许我分析应用程序中的单个线程
于 2009-08-13T23:28:40.133 回答
4

下载 Visual Studio 2010 Beta 1 的 Team Suite 版本(免费使用 6 个月左右?),并分析 C# 应用程序。

相信我。:)

编辑:逐行模式帮助我隔离了导致性能问题的操作员。我可以在没有每行突出显示的情况下找到它,但是当您可以滚动并查看使用它的热线时,您可以轻松修复它。

哦,如果您需要反馈/帮助,请单独联系我。

摘要视图:选择要过滤的 CPU 图表的任何部分。(来源:280z28.org
摘要视图

我喜欢边缘的逐行:(来源:280z28.org
详情查看

于 2009-08-14T05:49:27.787 回答
4

EQATEC Profiler是我一直想要使用的免费 .Net 分析器。

我想看到的一件事是 Mono 兼容性。我已经开始涉足 Mono,拥有一个 .Net 和 Mono 分析器会很棒!

于 2009-08-13T23:15:11.037 回答
3

如果它和JetBrains dotTrace做的事情一样,我真的会很高兴。

于 2009-08-13T23:12:20.653 回答
2

我想要的分析器:

  • 应该在 32 位和 64 位上工作
  • 应该有适用于所有层(客户端、应用程序服务器、数据库)的组件以及在它们之间建立关联的某种方式。例如,很高兴看到对任何层所做的更改如何影响其他层。这可能有助于决定在哪一层实现特定功能。
  • 用于自动化场景(构建服务器、压力测试等)的命令行界面
  • 应该有一个轻量级的采样模式和一个更精确的仪器模式。第二个应该尽可能少地影响执行测量。
  • 一个易于使用的 GUI,它应该生成使用 em 命令行模式所需的配置文件
  • 以标准格式生成结果(如果存在),以便我可以使用其他工具使用结果
  • 还应该生成或导出结果为 Visual Studio 的格式 (*.vsp)
  • 比较两个或多个结果文件,以查看代码库的演变或回归。
  • 收集目标应用程序数据并将其与每台目标机器上运行的其他进程的 PerfMon 数据相关联,以识别并发资源使用情况(内存、处理器、磁盘和网络 I/O)
  • 确定应调用某些警报机制的阈值。例如,如果特定场景花费的时间超过指定时间,则向某人发送电子邮件。
  • 能够在不干扰目标应用程序的情况下附加和分离正在运行的进程以收集采样数据。必须在生产现场使用。
于 2009-08-16T13:54:35.890 回答
2

我会在这里再添加一个真的很甜蜜。制作一个具有Mark(string)可用功能的简单程序集,如果应用程序调用该方法,则在结果中您可以选择从那里查看结果(结尾 | 一些其他指定的标记)。另一种可能性是BeginSequenceEndSequence或某事。如果您可以指定标记是仅适用于当前线程还是适用于所有线程,则双加。

于 2009-08-14T06:10:24.953 回答
2

几年前,我构建了一个探查器,并在 SO 上对其进行了描述,以回答我现在无法找到的其他一些问题,即如何构建探查器。

它基于至少部分自动化我使用了几十年的技术,这里给出了一个例子。它基于堆栈采样,关键在于如何呈现信息,以及用户经历的思考过程。

关于性能调整的一般信念,在学校教授(由几乎没有接触过实际软件的教授)并通过 50,000 名程序员不会出错的现象继续存在,我建议需要质疑并坚持更稳固的立足点。我远不是一个人有这种感觉,因为你可能会在 SO 周围巡游时收集到。

我认为分析器技术正在逐渐向堆栈采样和探索结果的方式发展(在我看来是更好的)。以下是我所依赖的见解(您可能会觉得有些不和谐):

  • 发现性能问题以便修复它们和衡量性能是两个完全不同的任务。它们是手段和目的,不应混淆。

  • 要发现性能问题,需要找出哪些活动占用了大量的挂钟时间,并且可以用更快的东西代替。

  • 此类活动的好处在于,它们需要时间这一事实使它们暴露于程序状态的随机时间样本。

  • 如果在您关心的时间间隔内采集样本,则不需要太多样本。即在等待用户输入的同时进行采样是没有意义的。为此,在我的分析器中,我让用户使用按键触发样本。

  • 你不需要很多样本的原因是这个。任何给定的性能问题都会在感兴趣的时间间隔内花费一部分挂钟时间。该区间内的随机样本有 X 概率“在行为中捕获它”,因此如果抽取 N 个样本,则在行为中捕获它的预期样本数为 NX。该样本数的标准偏差为 sqrt(NX(1-X))。例如,如果 N = 20,X = 20%,您可以预期大约 2 到 6 个样本来显示问题。这为您提供了对问题的不精确测量,但它确实告诉您它值得修复,并且它为您提供了一个非常精确的位置,无需任何进一步的侦探工作。

  • 问题通常表现为比必要更多的函数、过程或方法调用,尤其是当软件变大、抽象层越多、堆栈层越多时。我首先寻找的是出现在多个堆栈样本上的调用站点(不是函数,而是调用语句或指令)。它们出现的堆栈样本越多,它们的成本就越高。我寻找的第二件事是“它们可以被替换吗?” 如果它们绝对不能用更快的东西代替,那么它们就是必要的,我需要寻找其他地方。但通常它们可以被替换,我得到了很好的加速。因此,我正在仔细查看特定的堆栈样本,而不是将它们汇总为测量值。

  • 递归不是问题,因为一条指令的成本是它在堆栈上的时间百分比的原则是相同的,即使它调用自己也是如此。

  • 这不是我一次做的事情,而是连续通过。我解决的每个问题都会使程序花费更少的时间。这意味着其他问题在时间上所占的比例更大,使它们更容易被发现。这种效应复合,因此通常可以实现显着的累积性能改进。

我可以继续,但我祝你好运,因为我认为需要更好的分析工具,你有一个很好的机会。

于 2009-08-19T17:07:25.470 回答
2

Phsr 已经提到了EQATEC Profiler

我喜欢它的一个功能是,即使没有阅读任何文档或根本不关注我正在做的事情,我也能够从头到尾成功地分析应用程序。可用性是一件美妙的事情。请注意如何添加所有这些花哨的选项……不要在此过程中扼杀可用性。

于 2009-08-18T18:18:39.910 回答
1

我希望至少与 ASP.NET 有一些兼容性,尽管我知道要让它工作实际上非常困难。

逐行在 Shark 中非常好,我也想在 .NET 中使用它。

选择可视化工具是一件好事——我希望看到一堆不同的调用树、统计图,甚至可能是最常调用哪些方法的热图。

于 2009-08-14T14:25:04.813 回答
1

我在几乎所有配置文件中都误会的一件事是用于执行自动化分析和自动化测试的托管 API。

我可以想象你会想,WTF ......为什么要自动化分析?

答案是我们的一些客户对速度、内存使用等有要求。因此,对于每个新版本,我们都希望在发布之前对提到的内容进行测试。

于 2009-08-20T21:16:42.040 回答
1

我真的很想看到几件事:

数据采集​​:

  • 允许通过新线程跟踪上下文的选项。也就是说,当调用 new Thread() 或 ThreadPool.Queue...() 时,计算另一个线程执行的工作,就好像它发生在调用函数内部一样,即使它们发生在不同的线程上,并且调用方法实际上并没有阻塞。这最终将允许人们识别在实现异步模式的通用方法中产生大量工作的代码。这真的可以很棒!
  • 跟踪方法内部的分配。.Net 内存分析器有可能已经这样做了,但是确定哪些方法执行许多分配可能是无价的。即使其他工具可以做到这一点,把所有东西都放在一个工具中总是很棒的。
  • 一种能够检测使用中的“峰值”并仅对其进行分析的聚合。这在分析行为异常且不频繁的后台进程时可能会很方便。

界面结束:

  • 比较两次运行的能力,并突出它们之间的主要差异。
  • 调用树导航和热路径扩展(VS 风格)也很棒。
于 2009-08-16T19:56:15.217 回答
1

如果集成来自 Perfmon 的 .NET 相关分析措施,那就太好了,这样您就可以避免使用 perfmon 和您的应用程序进行“双重”监控。这对于所有与内存相关的项目尤其有用。

于 2009-08-14T06:30:10.327 回答
1

我首选的分析器是“DevPartner 性能分析社区版”(http://researchlibrary.theserverside.net/detail/RES/1165507815_474.html?psrc=MPR),不幸的是它不再可用。

使它在竞争中脱颖而出的是图形分析,它显示了一个框,显示当前选择的方法和被调用方法的传出连接器,显示每个方法花费的时间百分比。还有来电的连接器。当然,调用方法和调用方法是相同的,您可以根据需要扩展它们。这样,您可以沿着调用堆栈自由导航,尽可能深入地查看堆栈,并处理片段中的热路径。

第二个要求是“易用性”,即它应该与所有相关的应用程序类型一起运行,windows exe、web 应用程序、windows 服务、WCF 服务、(Silverlight?)、...。不仅适用于小型示例应用程序,而且适用于企业规模的不那么微不足道的应用程序。

于 2009-08-14T06:54:32.447 回答