2012-11-14 58 views
3

我试图在Visual Studio中使用内置分析器来剖析.NET应用程序。跟踪CPU样本,我遇到了一些奇怪的事情。在应用程序的一部分,我有以下(简化为清晰):visual studio profiler [clr.dll]

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

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

我的问题是:我可以跟踪到底发生了什么,我能做些什么来使其更快?请注意,3%听起来不太好,但GetResult()将在程序寿命期间被调用很多次,即使在测试它时只运行一次。而且我可以减少应用程序的响应时间非常重要。

非常感谢您提供任何答案!

+0

你必须选择正确的战斗。假设你*可以*使GetResult的1%而不是10%,那么你只能让你的程序加快9%。你还有90%的潜在优化目标,你实际上可能有源代码。你不能优化埋在clr.dll中的代码 –

+1

@HansPassant正如我写的,GetResult()在测试时只是执行的一小部分,因为启动阶段非常紧张。随着时间的推移,当GetResult()被调用了几千次时,我认为它几乎会占用100%的CPU时间。为了澄清,应用程序的响应时间几乎100%依赖于GetResult()。那么即使没有触及GetResult(),也有可能优化30%吗? – DukeOf1Cat

回答

1

你并不孤单试图找出探查器输出的含义。 SO有很多这样的问题。 我在一个大的.net应用程序中工作,并且我尝试了各种分析器,并且我知道这不是人们被教导的内容,但实际工作的是this method。 首先,您可以在初始化过程中采集一些样本,并在基本运行期间采集其他样本。你不必将两者堆积在一起,并试图猜测每个阶段的负载会是什么样的,而没有其他的负载。另外,如果只看CPU时间,由于额外的I/O,您将错过任何加速机会。 你不应该假设没有任何,或者它不重要。 如果你确实设法找到一个只有CPU的加速机会,并修复它,那么你没有找到的部分成为整体的一大部分。 你可能会发现,如果你找不到其他的东西来解决问题,那么你可能会认为没有别的东西,事实上有,而且可能很大。 如果您自己抽取样品,您可以清楚了解成本计算时间。

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

+0

是的,我在相关的文章中阅读了这个解决方案。整个cyckle需要大约500毫秒的时间才能运行,所以我认为很难在整个时间范围内手动采集样本。如果我手动触发循环(通过连接到应用程序并调用一个方法),然后点击暂停,那么很可能我总是会在同一个点击中它,因为有反应时间等等。您是否有建议进行自动操作这个? – DukeOf1Cat

+0

另外,如果我做的东西clr.dll不是一回事,但许多不同?那么他们可能只会在我的样品中显示一次,所以我怎么知道我是否找到了什么? – DukeOf1Cat

+1

@Joel:第一个问题:几个答案:1)尝试一下,看看,2)在你的半秒过程中放置​​一个像100次的临时循环。第二个问题:机会是在clr.dll中,但堆栈告诉你代码在请求它。所以,例如,如果你看到它做了很多'新的GetResult',你可以检查是否可以重新使用旧的 - 这样的东西。关键是,你可以用你的整个大脑理解发生的事情,而不是仅仅为了一些数字而感到困惑。 –

2

您可能会考虑使用可免费下载的PerfView工具。我同意迈克在这种情况下(网络请求)CPU可能不是主导因素,所以使用CPU分析器很容易不准确。 PerfView可以执行CPU分析,但它也能够进行'挂钟'分析(请参阅PerfView欢迎页面上的'挂钟/锁定时间'链接)。这个视图显示了CPU和阻塞,但在解释数据时需要更加小心(你必须找到正确的线程并包含感兴趣的线程段)。如果这是一个ASP.NET应用程序,则有一个特殊的视图(ASP.NET线程时间堆栈),这是特别感兴趣的(也在文档中)。

坏消息是没有理解你的分析器告诉你什么的替代品,所以你将不得不花费一些时间来学习这个工具告诉你什么。我认为这是值得的,并且有PerfView Videos,并且在工具中内置了相当不错的文档来帮助你,但是你必须愿意投入一些时间(例如一个小时)。

好消息是,您的投资回报是不平凡的。您应该能够在一个小时内找出您的特定问题,并且只需几个小时的投资,您就可以在几乎任何应用程序(甚至是您没有构建的应用程序)中计算出各种各样的问题。该工具功能非常强大,但具有强大功能的调查有很多潜在途径,并且具有滥用数据和混淆的能力。

0

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

相关问题