我正在尝试调整我的应用程序的性能。我很好奇哪些方法需要最长的处理时间,因此应该检查是否有任何优化机会。

是否有任何现有的免费工具可以帮助我可视化调用堆栈以及每个方法需要多长时间才能完成?我正在考虑将调用堆栈显示为堆叠条形图或 树形图 所以很容易看出 方法A() 花了 10 秒才能完成,因为它调用了 方法B()方法(C) 花了 3 秒和 7 秒才完成。

这样的事情存在吗?

有帮助吗?

解决方案

是的,它们被称为性能分析器。看看RedGate ANTS和JetBrains的dotTrace,不是免费的,而是相当便宜,而且比我见过的任何免费替代方案都要好。

其他提示

有几种分析器可用。我只熟悉一个(Visual Studio Team Suite中包含的那个),但它并不是免费的。我必须说,它足够强大/可靠,我不想尝试切换到另一个。我听说的另一个是Red Gate的.NET分析器(也不是免费的)。这两个都有功能集,包括但不限于你所追求的。如果这是用于商业应用程序开发,请务必检查它们。 :)

测量方法的方法是通过分析仪内的仪器或采样。

仪表

Instrumentation大致相当于重写所有代码以执行以下操作:

public void Foo()
{
   //Code
}

public void Foo()
{
   InformTheProfilingCodeThatFooStarted();
   //Code
   InformTheProfilingCodeThatFooEnded();
}

由于探查器知道所有内容何时开始和停止,因此可以管理此时开始和停止的堆栈,并在以后提供此信息。许多人允许你在一个线路级别执行此操作(通过执行相同的操作,但在每一行之前进行更多操作。

这可以获得关于应用程序中“调用图”的100%准确信息,但这样做的代价是:防止内联方法并为每个方法调用增加相当大的开销。

取样

另一种方法是采样。

而不是试图获得100%准确的调用图但实际的准确度不高这种方法的工作原理是,如果它定期检查您的应用中发生了什么它可以让你很好地了解它在各种功能中分配的时间,而无需花费太多精力来解决这个问题。大多数采样分析器知道如何在中断程序时“解析”调用堆栈,这样他们仍然可以合理地了解调用哪个函数以及调用了多少时间,但无法告诉您这是否是(比如)对Foo()进行了10次调用,这次调用对Bar()进行了10次调用,或者对Foo()进行了一次调用,这是对Bar()的一次调用,这次调用恰好持续了很长时间,被抽样了10次。

这两种方法各有利弊,解决不同的问题。一般来说,采样方法是最好的首先开始,因为它具有较小的侵入性,因此应该提供更准确的信息花费时间这通常是最重要的第一个问题,然后才能解决为什么

我知道.net代码只有一个免费的采样分析器,它是免费的可再发行分析器,它与VS 2008 Team System版本链接(但可以单独下载)。除了Visual Studio的(非常昂贵的)Team System版本之外,不能轻易查看产生的输出。

红门ANTS不支持采样(此时),Jet Brains(dotTrace)和MS Visual Studio Team System具有支持两种样式的分析器。在成本效益的基础上,您更喜欢这个问题。

这是我使用的方法。 如果您有一个带有暂停按钮的 IDE,那么它不需要任何成本并且工作得很好。

它大致告诉您每个例程(更准确地说,每个语句)花费了挂钟时间的百分比。这比执行例程或语句的平均持续时间更重要,因为它会自动影响调用计数。通过采样挂钟时间,它自动包括 CPU、IO 和其他类型的系统时间。

更重要的是,如果您查看例程位于调用堆栈上的示例,您不仅可以看到它正在做什么,还可以看到 为什么. 。重要的原因是,您真正想要的是花费的时间可以用更快的东西代替。如果没有“为什么”信息,您就必须猜测那是什么。

顺便提一句:这种技术鲜为人知,主要是因为教授不教授它(即使他们知道),因为他们很少需要像我们在现实世界中那样使用可怕的软件,所以他们对待 gprof 作为分析的基础范式。

这是一个使用它的示例。

附:预计百分比加起来将远远超过 100%。考虑百分比的方法是,如果语句或例程在 X% 的时间内位于堆栈上(根据少量样本估计),那么如果该语句或例程大约会缩短多少挂钟时间可以花费更少的时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top