4

我正在尝试使用内置分析器在 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()”将被调用很多次,即使在测试时它只运行一次。我可以减少应用程序的响应时间,这一点非常重要。

非常感谢您的任何答案!

4

3 回答 3

3

您并不是唯一一个试图弄清楚探查器输出的含义的人。SO有很多这样的问题。我在一个大型 .net 应用程序中工作,我尝试了各种分析器,我知道这不是人们所学的,但真正有效的是这种方法。一方面,您可以在初始化期间采集一些样本,并在基本运行时采集其他样本。您不必将两者叠加在一起并尝试猜测没有另一个阶段的每个阶段的负载情况。

此外,如果您只看 CPU 时间,您会因为额外的 I/O 而错过任何加速机会。你不应该假设没有任何东西,或者它是微不足道的。如果您确实设法找到了仅 CPU 加速的机会并修复它,那么您没有找到的部分将成为整体的较大部分。您可能会遇到这样的情况,如果您找不到其他要修复的东西,您可能会认为没有其他东西,而实际上有,而且可能很大。如果您自己取样,您可以清楚地了解什么是花费时间。

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

于 2012-11-14T14:00:32.717 回答
2

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

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

好消息是,您的投资所获得的回报并非微不足道。您应该能够在一小时内找出您的特定问题,并且通过几个小时的投入,您将能够在几乎任何应用程序中找出各种各样的问题(即使是您没有构建的问题)。该工具非常强大,但强大的功能带来了许多潜在的调查途径,并且具有滥用数据和混淆的能力。

于 2012-11-15T02:20:23.133 回答
1

this post is old but I wanted to clarify a few things. In the current implementation of the profiler whenever you see [], it means we know the name of the dll but were unable to resolve symbols for it. One reason is that you did not select the microsoft symbol servers in your sysmbol settings. Another possibility is that the module was ngen (wherein you will see []). In that case you will need to generate the ngen pdb to actually get symbols resolved. Once that occurs you should be able to see exacly what functions are using what fraction of the cpu.

于 2013-11-19T17:42:10.347 回答