CLR全面透彻解析: 及早并经常评量性能,第2部分2011-10-26 msdn Vance Morrison在上期的“CLR 全面透彻解析”中,我强调要可靠地创建高性能的程序,您需要了解设计 初期所使用的各个组件的性能(msdn2.microsoft.com/magazine/cc424899)。这就需要用到性能数据。 因此,测量是设计过程中不可或缺的一部分。我还在那一期中介绍了一款名为 MeasureIt 的工具,利用它可以轻松地创建新基准,从而快速地收集 制定良好设计决策所需的数据。诸如 MeasureIt 之类的工具所提供的原始数字是极为重要的,另外,使 人们能够了解这些数字的基本含义也非常重要。在此理解的基础上,您在实际测量之前即可预测出它的某 些性能。这就是我将在这里讨论的内容。MeasureIt 概述如果您尚未下载 MeasureIt 工 具,我强烈建议您立即下载。该工具位于《MSDN® 杂志》网站中本专栏的下载代码内,由一个 EXE 文件组成。运行它将生成一个网页,显示运行某个基准套件的结果。安装后,可通过运行以下命令访问其 他文档:
measureIt /usersGuide
MeasureIt 随同其源代码一起出现,使用 /edit 限 制符可以方便地将其解压缩。这使得添加新基准就像编写一两行代码(并提供要定时的代码)一样轻松。 有关如何执行此操作的更多详细说明,请参阅用户指南。MeasureIt 基准与不同的性能区域相关 联,当该工具启动时会在命令行上指示出来。 默认情况下(即无命令行参数),MeasureIt 会运行一组 基准(约 50 个),其中包括各种基本的 Microsoft® .NET Framework 运行时操作。图 1 中显示了 简化的示例输出。Figure 1 示例基准
名称 | 中值 | 平均值 | 标准偏差 | 最小值 | 最大 值 | 示例 |
NOTHING [count=1,000] | 0.000 | 0.037 | 0.110 | 0.000 | 0.366 | 10 |
MethodCalls:EmptyStaticFunction() [count=1000 scale=10.0] | 1.000 | 1.103 | 0.496 | 0.857 | 2.577 | 10 |
ObjectOps:new Class() [count=1000 scale=10.0] | 5.060 | 10.223 | 13.927 | 3.340 | 51.215 | 10 |
ObjectOps:new FinalizableClass() [count=1000 scale=10.0] | 78.552 | 155.408 | 168.595 | 64.997 | 629.243 | 10 |
ObjectOps:(Class) Activator.CreateInstance(classType)] | 102.510 | 102.949 | 4.076 | 96.876 | 109.819 | 10 |
Arrays:localIntPtr[i] = 1 [count=1,000 scale=10.0] | 0.713 | 0.664 | 0.076 | 0.574 | 0.773 | 10 |
Arrays:string[i] = aString [count=1,000 scale=10.0] | 3.402 | 3.405 | 0.012 | 3.397 | 3.442 | 10 |
Delegates:aInstanceDelegate() [count=1,000 scale=10.0] | 1.235 | 1.205 | 0.111 | 1.094 | 1.475 | 10 |
MethodReflection:Method.Invoke EmptyStaticFunction() | 472.283 | 472.744 | 5.409 | 466.291 | 482.094 | 10 |
P/Invoke:FullTrustCall() [count=1,000] | 6.184 | 6.254 | 0.793 | 5.469 | 7.599 | 10 |
P/Invoke:10 FullTrustCall() (10 call average) | 2.669 | 2.688 | 0.061 | 2.665 | 2.870 | 10 |
P/Invoke:1 PartialTrustCall [count=1,000] | 27.806 | 30.440 | 8.735 | 26.343 | 56.582 | 10 |
MeasureIt 将每个基准运行 10 次,并根据结果计算统计数据。这些报告值随即被标量化 ,从而使对空方法的单个调用花费一个时间单位。例如,图 1 显示分配某个小对象的中值时间为 5.06, 这表示通常分配小对象仅是调用方法所花费时间的五倍多一点。但并非所有的情况都是如此。请注意,对 象分配的最长时间要超过 51 个单位。因此,它所花费时间经常要比平均情况更长。事实上,如果该基准 不幸强制收集大量碎片,则其在方法中花费的时间很可能要比此处报告的最大值多出许多。即便 如此,您还是应该能发现 MeasureIt 工具的价值。几乎无需进行任何工作,您即可粗略地获知小型分配 的开销如何。由于工具会收集多个示例并计算统计数据,因此您还会了解到某些操作(如对象分配)可具 有相当多的变化,这才是重点。通过了解最小值、最大值和标准偏差信息,您可以确定是否足以信赖测量 的可靠性。