C#/ .NET探查器应具备哪些功能?

时间:2009-08-13 22:58:18

标签: c# .net performance profiler

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

这是一项相对较新的努力,但当我查看可用的分析仪系列时,我并没有给人留下深刻的印象。我已经做了一些基于现有产品的初步工作,但我觉得这是一个很好的问题:你究竟想从个人资料中找到什么?

我来自实时图形和游戏,所以对我来说,剖析器尽可能快。否则,游戏变得无法播放,并且分析无法播放的慢速游戏往往不会很有启发性。因此,我愿意牺牲一些准确性。我甚至不关心异常。但我不熟悉其他类型应用程序的开发人员感兴趣的内容。是否有适合您的创建或中断功能?现有工具在哪里崩溃?

同样,我很抱歉,如果这只是StackOverflow的基础,但它对我来说一直是一个非常有用的资源,而且这里有很多开发人员。

14 个答案:

答案 0 :(得分:17)

我的要求:

  • 收集统计数据而不会对申请产生影响 - 例如不填写内存,允许从有问题的应用程序中收集数据
  • 能够简单且可重复地指定测量(数据驱动)
  • 自动化,以便我可以在没有点击和没有UI的情况下重复测量
  • 使我们能够了解与WPF和其他声明性技术(如DLR或WF
  • )相关的问题
  • 没有安装 - 没有gac,msi等,如果可以在网络上运行则更好
  • 从头开始支持64位
  • 不要试图了解可以做的所有分析 - 鼓励生态系统。如果可以使用其他工具分析原始统计数据那就更好了。
  • UI如果有的话应该是好的 - 但它的统计数据很重要。所以不要花时间在那上面,让核心分析变得更好。
    • 支持简单地分析不像服务和Web应用程序那样的直接应用程序。

会喜欢:

  • 考虑跨应用程序支持 - 大型应用程序通常需要了解跨多个可执行文件的应用程序性能行为。如果您的探查器可以轻松关联这些数据,那就更好了

答案 1 :(得分:11)

我的愿望清单:

  • 真的很容易使用 - 简单(但功能强大)的GUI
  • 性能卓越 - 能够分析极其繁重的应用。
  • X64 X32 支持
  • 了解SQL ,能够为我的所有SQL调用提供堆栈跟踪和持续时间,以及SQL。
  • 易于分析,无需复杂,重新编译应用程序流程。
  • 易于分析作为副作用启动的服务,网站和流程
  • “生产模式”,允许您从基于生产的系统收集关键统计数据。
    • “自动瓶颈查找程序”:针对生产应用程序运行,并使用启发式方法确定哪些方法很慢。
  • 根据线程分析,告诉我哪些线程正在完成所有工作以及在哪里工作。
  • 各种粒度的配置文件,允许执行“便宜”的配置文件,只收集关键信息并深入细化分析。
  • 异常跟踪器,允许我跟踪我的应用程序中抛出的所有异常(关键统计信息和详细信息)
  • 每个线程分析 - 允许我在应用程序中分析单个线程

答案 2 :(得分:4)

EQATEC Profiler这是一个我想要使用的免费.Net探查器。

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

答案 3 :(得分:4)

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

相信我。 :)

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

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

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

我喜欢边缘的逐行:
Details View
(来源:280z28.org

答案 4 :(得分:3)

如果它做了与JetBrains dotTrace相同的事情,我会非常高兴。

答案 5 :(得分:2)

我会在这里添加一个真的很甜的东西。创建一个具有Mark(string)函数的简单程序集,其中如果应用程序调用该方法,那么在结果中您可以选择从那里查看结果(结束|一些)其他指定标志)。另一种可能性是BeginSequenceEndSequence或其他。如果您可以指定标记是仅适用于当前线程还是适用于所有线程,则加倍。

答案 6 :(得分:2)

我想在个人资料中找到什么:

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

答案 7 :(得分:2)

Phsr已经提到了EQATEC Profiler

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

答案 8 :(得分:2)

多年前,我构建了一个分析器,并在SO上描述了它,以回答我目前无法找到的其他问题,关于如何构建分析器。

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

关于性能调整的一般信念,即在学校教授(由几乎没有接触现实世界软件的教授),并且继续通过50,000程序员 - 不可能是错误的现象,我建议需要质疑并且站稳脚跟。我感觉就像这样远远不是一个人,因为你可能会在周围巡航时聚集起来。

我认为探测器技术正在逐步发展(在我看来更好),即叠加采样和探索结果的方法。以下是我所依赖的见解(您可能会发现有点不和谐):

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

  • 要发现性能问题,我们需要找到哪些活动会占用大量的挂钟时间,这些时间可以用更快的速度替换。

  • 这些活动的好处是,他们花时间将它们暴露给程序状态的随机时间样本。

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

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

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

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

  • 这不是我曾经做过的事,而是在连续的传球中。我修复的每个问题都会使程序花费更少的时间。这意味着其他问题变得越来越大,使它们更容易找到。这种效果会复合,因此通常可以实现显着的累积性能提升。

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

答案 9 :(得分:1)

如果集成了来自Perfmon的.NET相关性能分析测量,那将是很好的,这样您就可以避免使用perfmon和您的应用程序进行“双重”监控。这对所有与内存相关的项目非常有用。

答案 10 :(得分:1)

我的首选个人资料是“DevPartner Performance Analysis Community Edition”(http://researchlibrary.theserverside.net/detail/RES/1165507815_474.html?psrc=MPR),遗憾的是它已不再可用。

使它在竞争中脱颖而出的是图形分析,它显示了当前所选方法的框和传出的连接到被调用的方法,显示了每个方法花费的时间百分比。也是接听电话的连接器。当然,caling和被调用的方法都是一样的,你可以根据需要扩展它们 这样,您可以在调用堆栈中自由导航,根据需要查看堆栈,并处理片段中的热路径。

第二个需求是“易用性”,即它应该运行所有相关的应用程序类型,Windows exe,Web应用程序,Windows服务,WCF服务,(Silverlight?),....不仅适用于小型样本应用程序,而且适用于企业规模不那么重要的应用程序。

答案 11 :(得分:1)

我希望至少与ASP.NET有一些兼容性,但我知道实际上很难让它工作。

在Shark中逐行排队,我也想在.NET中使用它。

可视化器的选择是一件好事 - 我希望看到一堆不同的调用树,统计图表,甚至可能是最频繁调用哪种方法的热图。

答案 12 :(得分:1)

我真的很想看到几件事:

数据收集:

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

用户界面结束:

  • 能够比较两次运行,并突出显示它们之间的主要差异。
  • 呼叫树导航和热路径扩展(VS风格)也很棒。

答案 13 :(得分:1)

几乎所有配置文件中我误解的一个问题是托管API,用于执行自动分析和自动化测试。

我可以想象你认为,WTF ......为什么人们会喜欢自动化分析?

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