测量函数、类和进程速度的最佳方法

3

如何最好地测量函数和类的速度?对于每个函数,都有各种解决方案,我想知道如何测量运行速度,并使用最佳解决方案优化我的共享类。

此外,如何衡量SQL速度,例如存储过程、选择、视图等之间的差异?

3个回答

4

你有两个选择。

使用 System.Diagnostics.Stopwatch 来测量特定方法的性能。

这是 .NET 中的高分辨率计时器,您可以用它来测量代码的特定部分。

如果您需要测量整个应用程序的性能,请使用性能分析器。

您可以使用 Visual Studio 的 Ultra 版本中内置的分析器,或者像 EQATEC 这样的工具。


1
最好使用分析器。测量墙钟执行时间(例如Stopwatch类所做的)的问题在于它受到许多超出您控制范围的因素的影响。仅举几个这样的因素,有网络和其他I/O延迟,以及操作系统调度程序决策,这些决策会影响应用程序和线程的相对优先级。如果您正在虚拟化环境中运行,那么这也可能对毫秒级墙钟时间测量产生相对较大的影响。分析器不会完美无缺,但它将为您提供更好的执行代码所需时间的概念。
此外,一个好的分析器通常还可以为您提供其他有用的指标,比如您的代码在执行过程中使用了多少内存。

0

最好不要混淆测量和优化的目标。它们是不同的任务。测量虽然有助于量化修复问题的结果,但很难告诉你应该修复什么。

在测量方面,如果我想展示某个东西有多快,我需要一个受控环境和一台好的秒表。然而,为了进行优化,粗略的测量(例如运行1000次)和使用简单的计时器已经足够了。

在优化方面,我关心的不是速度,而是不必要的活动。没有必要以高速运行代码来找出它。

当任何程序运行时,它都会形成一个调用树。优化的方法包括尽可能删除尽可能多的叶子(指令)和果实(I/O)。剪枝整个分支是一个不错的方法。

  • 在除了最小的程序之外,典型的优化机会包括调用点(代码行,在这些位置调用函数,而不是函数本身),当你意识到有多少调用树从中发芽时,可以真正地通过另一种方式完成它。一个看起来无害的代码行可能负责整个树的大部分,你可能可以简单地将其切掉。
为了找出这些机会,我认为墙钟时间堆栈采样是最好的方法。这个过程并不需要高效,而且只需少量的样本就可以达到相同甚至更好的效果,不需要大量的样本。 由于任何一个编写好的程序都不止一次提供加速的机会,所以需要反复进行这个过程。 下面是一个示例。

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