C# 如何确定代码中哪些部分运行缓慢?

21

我编程时间不长,对哪种技术最快不熟悉,所以想知道是否有使用VS或第三方工具来完成这个任务的方法?

谢谢


1
你已经确认了你的代码确实很慢吗? - Ed S.
10个回答

26

性能分析工具对于测量很有用。

但是你的问题是“如何确定代码的慢部分在哪里?”。

那是一个不同的问题。这是诊断,不是测量。

我知道这不是一种流行的观点,但这是真的。

就像一个试图削减成本的企业。

一种方法(自上而下)是测量整体财务状况,然后按类别和部门分解,并尝试猜测哪些可以被消除。那是测量。

另一种方法(自下而上)是随机走进一个办公室,随机挑选某个人,并详细询问他们当时正在做什么以及(重要的是)为什么。

多做几次这种方法。

这就是哈利·特鲁曼在第二次世界大战爆发时所做的事情,在美国国防工业中,他立即访问了几个地点,揭露了大规模的欺诈和浪费。那是诊断。

在代码中,您可以通过非常简单的方式来执行此操作:“暂停”它并问它为什么花费了特定的周期。通常,调用堆栈会详细告诉您原因。

多做几次这种方法。

这就是抽样。一些性能分析工具对调用堆栈进行抽样。但出于某种原因,他们坚持总结每个函数的时间,包括和不包括。那就像在企业中按部门或者不按部门总结一样。

它失去了你需要的信息,即细节信息,以判断周期是否必要。

回答你的问题:

只需多次暂停程序,并每次捕获调用堆栈。如果代码非常慢,则浪费的函数调用将出现在几乎每个堆栈上。它们将精确指向“你的代码的慢部分”。

添加:RedGate ANTS 已经取得了进展。它可以给你每一行代码的成本,而且非常炫酷。如果你使用 .NET,并且可以花费三位数的价格,也不介意等待安装和学习,那么它可以告诉你很多暂停键所不能告诉你的东西,并且呈现更加美观。


1
我完全同意Mike的观点。我建议你编辑一下,只发布“回答你的问题”这部分内容。 - Maurice Flanagan
1
@Mo:谢谢 - 我会考虑的。只是我感到非常沮丧,整个行业在这个特定问题上如此盲目,而在其他事情上又如此聪明。 - Mike Dunlavey
这个工具能用于分析 Web 应用程序吗?它们不会持续使用 CPU,只有在 Web 请求时才会使用,这使得暂停它们变得困难。 - Martin Staufcik
@MartinStaufcik:我认为是这样的。我没有调整过任何Web应用程序,但原则应该是相同的,因为它只是I/O。暂停告诉您为什么时钟时间被消耗,这可能很容易地成为CPU时间,也可能是I/O。 - Mike Dunlavey

8

2

我用过ANTS Profiler,可以像其他用户一样推荐使用。

与它能省下的开发时间相比,价格微不足道。

如果你是一名职业开发者,而你的公司不愿为你购买,那么要么换一家公司,要么自己买。


2
为了分析大型复杂的UI应用程序,通常需要一组工具和方法。在最近一次项目中,为了改善.Net 2.0 UI应用程序的性能,我使用了以下方法和工具。
首先,我采访了用户并通过自己的使用案例来列出目标使用案例列表,以凸显系统性能较差的区域。也就是说,我不想花费n天的时间来优化一个几乎从未被使用但速度非常慢的功能。但是,如果一个功能有点缓慢但每天被调用1000次,我会花时间去优化它。
确定候选使用案例后,我使用自己的轻量级日志记录类(我使用了一些高性能计时器和自定义日志解决方案,因为我需要亚毫秒精度)来对代码进行仪器化。您可能可以使用log4net和时间戳来完成这个任务。我之所以要对代码进行仪器化是因为有时候读取自己的日志比读取分析器的输出更容易。由于多种原因,我需要同时使用两者(例如,使用分析器测量.Net用户控件布局并不总是简单的)。
然后,我使用ANTS分析器运行我的仪器化代码并分析使用案例。通过将ANTS分析结果与我的日志文件相结合,我很快就能发现我们应用程序中的问题。
我们还分析了服务器以及UI,并能够确定在UI、传输线路和服务器上花费的时间等等。值得注意的是,一次运行并不足够,第一次运行通常是可以抛弃的。让我来解释一下:计算机负载、网络流量、JIT编译状态等都可能影响特定操作所需的时间。一个简单的策略是测量一个操作n次(例如5次),排除最慢和最快的运行结果,然后分析剩余的分析结果。

我认为你太快乐地放弃了。在考虑放弃之前,我至少会看几十个结果。通常,在进行性能分析时,我会取最小值/最大值/平均值。然后,我会呈现有和没有第一次运行的结果(以隔离初始化和JIT)。 - Quibblesome

2

Eqatec profiler 是一款可爱的小型分析器,它是免费且易于使用的。与Ants分析器在功能方面相比可能不会有太大优势,但我认为它仍然非常酷,值得一试。


2
我只是设置了断点,Visual 将告诉您在断点之间经过了多少毫秒。因此,您可以手动查找它。

1

ANTS Profiler的教程/说明。链接 - Ric Tokyo

0

0

如果你不想花钱,新版本的VS带有一个分析器,但老实说它看起来并不好用。ATI / AMD做了一个免费的分析器...但对我来说不是很用户友好(我无法从中获得任何有用的信息)。

我的建议是使用代码自己计时函数调用。如果它们很快,并且您没有高精度定时器,或者由于多种原因(例如每个x次调用构建某种缓存),调用速度变慢,请尝试运行每个函数x10000次或更多,然后相应地除以结果。这可能不适用于某些代码部分,但如果您无法找到一个好的,免费的第三方解决方案,那么除了付费之外,基本上就只剩下这个方法了。


0

另一个选择是英特尔的VTune


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接