【发布时间】:2011-02-03 09:12:36
【问题描述】:
衡量函数和类速度的最佳方法是什么?对于每个功能,都有各种解决方案,我想知道如何测量运行速度并使用可能的最佳解决方案优化我的共享类。
还有你如何衡量 SQL 速度,例如存储过程、选择、视图等之间的差异?
【问题讨论】:
标签: .net sql testing performance measure
衡量函数和类速度的最佳方法是什么?对于每个功能,都有各种解决方案,我想知道如何测量运行速度并使用可能的最佳解决方案优化我的共享类。
还有你如何衡量 SQL 速度,例如存储过程、选择、视图等之间的差异?
【问题讨论】:
标签: .net sql testing performance measure
你有两个选择。
具体方法请使用System.Diagnostics.Stopwatch。
这是 .NET 中的高分辨率计时器,可用于代码的特定部分。
如果您需要衡量整个应用程序的性能,请使用分析器。
您可以使用 Visual Studio Ultra 版本的内置分析器,或者像 EQATEC 这样的工具。
【讨论】:
您最好使用分析器。测量挂钟执行时间(例如由Stopwatch 类完成)的问题在于它受到许多您无法控制的因素的影响。仅举几个这样的因素,有网络和其他 I/O 延迟,以及影响应用程序和线程的相对优先级的操作系统调度程序决策。如果您在虚拟化环境中运行,这也会对毫秒范围的挂钟时间测量产生相对较大的影响。分析器并不完美,但它会让您更好地了解实际花费了多少时间来执行您的代码。
除此之外,一个好的分析器通常还可以为您提供其他有用的指标,例如您的代码在执行期间使用了多少内存。
【讨论】:
最好不要混淆衡量和优化的目标。它们是不同的任务。测量虽然有助于量化修复某事的结果,但无法告诉您要修复什么。
关于测量,如果我想展示某物的速度有多快,我需要一个可控的环境和一个好的秒表。但是,出于优化的目的,粗略的测量(例如运行 1000 次)和使用简单的计时器已经足够了。
关于优化,我不关心速度。 我担心不必要的活动。 无需高速运行代码即可找到。
当任何程序运行时,它都会追踪调用树。 优化包括去除尽可能多的叶子(指令)和尽可能多的水果(I/O)。 一个很好的方法是修剪整个分支。
要找到这些,我认为挂钟时间堆栈采样是最好的方法。这不一定是一个有效的过程,并且相当少量的样本与大量样本一样好(或更好)。 有必要重复执行它,因为任何给定的程序,正如第一次编写的那样,不只包含一个加速机会。它包含几个。 Here's an example.
【讨论】: