visual studio profiler [clr.dll]

时间:2012-11-14 11:46:39

标签: .net profiler

我正在尝试使用内置分析器在Visual Studio中分析.NET应用程序。跟踪CPU样本,我遇到了一些奇怪的事情。在应用程序的一部分中,我有以下内容(为简洁起见而简化):

var requestObject = new RequestObject(parameters);
var result = GetResult(requestObject,"stringvalue");

我看到第二行使用了大约10%的样本。但是,方法GetResult()仅使用大约7%,其余的似乎在[clr.dll]中。我知道clr.dll负责垃圾收集,JIT编译,上下文切换等,并且GetResult()方法相当复杂(跨越多个程序集,可能使用多个线程),因此不需要采取其中一些操作是不可信的一旦方法返回。 RequestObject也有点复杂,因此可能与它有关。

我的问题是:我能否准确追踪到底发生了什么,以及如何才能让它更快?请注意,3%的声音听起来不多,但GetResult()会在程序生命周期中被调用很多次,即使测试它只运行一次。我可以减少应用程序的响应时间非常重要。

提前感谢您的任何答案!

3 个答案:

答案 0 :(得分:2)

你并不是唯一一个想弄清楚探查器输出意味着什么的人。 SO有很多这样的问题。 我在一个大的.net应用程序中工作,我尝试过各种各样的分析器,我知道这不是人们的教导,但实际上有效的是this method。 首先,您可以在初始化期间获取一些样本,并在基本运行时间内获取其他样本。你不必把两者堆在一起,试着猜测每个阶段的载荷是什么样的,而不是另一个阶段。

此外,如果您只查看CPU时间,则会因为额外的I / O而错过任何加速机会。 你不应该假设没有,或者它是微不足道的。 如果您确实设法找到仅限CPU的加速机会并修复它,那么您未找到的部分将成为整体的一小部分。 如果你找不到其他任何东西可以修复,你可能会发现,你可能会认为没有别的东西,实际上它有可能很大。 如果您自己采样,您可以清楚地了解成本时间。

你可能想说“但那不准确!” 好吧,好吧,如果有什么东西你可以解决,修复它会节省90%的时间,但你的询问是不准确的,并说它需要80%,或95%,这会阻止你修复它并获得10-加速? 事实是,当你的目标是实际发现问题而不是仅仅测量它们时,它们越大,所需的样本就越少。

答案 1 :(得分:2)

您可能有兴趣使用可免费下载的PerfView工具。我同意Mike的观点,在这种情况下(Web请求)CPU可能不是主导因素,因此使用CPU分析器可能很容易出错。 PerfView可以进行CPU分析,但它也能够进行“挂钟”分析(请参阅PerfView欢迎页面上的“挂钟/阻塞时间”链接)。此视图显示了两个CPU和阻塞但在解释数据时需要更加谨慎(您必须找到正确的线程并包含感兴趣的线程段)。如果这是一个ASP.NET应用程序,则会有一个特殊的视图(ASP.NET线程时间栈),这是特别感兴趣的(也在文档中)。

坏消息是,无法替代理解你的探查者告诉你的内容,因此你将不得不花一些时间来了解这个工具向你展示的内容。我认为它更值得,并且有PerfView Videos,并且该工具内置了相当好的文档来帮助您,但您必须愿意投入一些时间(例如一小时)。

好消息是,您的投资的回报是非平凡的。您应该能够在一小时内找出您的特定问题,并且通过几个小时的投资,您将能够在几乎任何应用程序(甚至是您未构建的应用程序)中找出各种各样的问题。该工具功能非常强大,但随着功能的出现,有许多潜在的调查途径,并且具有滥用数据和混淆的能力。

答案 2 :(得分:0)

这篇文章很老但我想澄清一些事情。在您查看[]时,在分析器的当前实现中,这意味着我们知道dll的名称但无法为其解析符号。一个原因是您没有在sysmbol设置中选择微软符号服务器。另一种可能性是模块是ngen(其中你会看到[])。在这种情况下,您将需要生成ngen pdb以实际解析符号。一旦发生这种情况,你应该能够看到什么函数正在使用cpu的哪个部分。