性能测试框架概述
性能测试接口利用脚本、函数和基于类的单元测试接口。您可以在性能测试中执行鉴定,以确保在度量代码性能时功能行为正确。此外,您还可以将性能测试作为标准回归测试来运行,以确保代码更改不会中断性能测试。
确定已测量代码的范围
此表介绍为不同类型的测试测量的代码。
| 测试类型 | 测量内容 | 排除项 |
|---|---|---|
| 基于脚本 | 每节脚本中的代码 |
|
| 基于函数 | 每个测试函数中的代码 |
|
| 基于类 | 每个带 Test 属性标记的方法中的代码 |
|
基于类,从 matlab.perftest.TestCase 派生并使用 startMeasuring 和 stopMeasuring 方法 | 每个带有 Test 属性的方法中 startMeasuring 和 stopMeasuring 调用之间的代码 |
|
基于类,从 matlab.perftest.TestCase 派生并使用 keepMeasuring 方法 | 每个带有 Test 属性标记的方法中的每个 keepMeasuring-while 循环中的代码 |
|
计时试验的类型
您可以创建两种类型的计时试验。
不定次计时试验会采集不定个数的测量值,以达到指定的误差界限和置信水平。不定次计时试验用于定义测量样本的统计目标。使用
runperf函数或TimeExperiment类的limitingSamplingError静态方法生成此试验。定次计时试验会采集固定个数的测量值。定次计时试验可用于测量代码的首次成本或明确控制样本大小。使用
TimeExperiment类的withFixedSampleSize静态方法生成此试验。
此表汇总了不定次计时试验和定次计时试验的差别。
| 不定次计时试验 | 定次计时试验 | |
|---|---|---|
| 预备测量数 | 默认为 5,但可通过 TimeExperiment.limitingSamplingError 配置 | 默认为 0,但可通过 TimeExperiment.withFixedSampleSize 配置 |
| 样本数量 | 默认介于 4 和 256 之间,但可通过 TimeExperiment.limitingSamplingError 配置 | 在试验构造期间定义 |
| 相对误差界限 | 默认为 5%,但可通过 TimeExperiment.limitingSamplingError 配置 | 不适用 |
| 置信水平 | 默认为 95%,但可通过 TimeExperiment.limitingSamplingError 配置 | 不适用 |
| 无效测试结果的框架行为 | 停止测量测试并转至下一个 | 采集指定数量的样本 |
编写具有测量范围的性能测试
如果基于类的测试派生自 matlab.perftest.TestCase 而非 matlab.unittest.TestCase,则可以多次使用 startMeasuring 与 stopMeasuring 或 keepMeasuring 方法,以定义性能测试测量边界。如果测试方法多次调用 startMeasuring、stopMeasuring 和 keepMeasuring,则性能测试框架会对测量值进行累加并求和。性能测试框架不支持嵌套的测量边界。如果您在 Test 方法中未能正确使用这些方法,且以 TimeExperiment 方式运行测试,则框架会将测量值标记为无效。另外,您仍可将这些性能测试作为单元测试运行。有关详细信息,请参阅使用类测试性能。
运行性能测试
运行性能测试的方法有两种:
使用
runperf函数运行测试。此函数使用不定数目的测量值获得 0.95 置信水平的相对误差界限为 0.05 的样本均值。它会运行这些测试 5 次来预备该代码,并运行 4 到 256 次来采集符合统计目标的测量值。使用
TestSuite类中的testsuite函数或方法生成显式测试套件,然后创建并运行计时试验。使用
TimeExperiment类的withFixedSampleSize方法构造采集固定个数的测量值的计时试验。您可以指定固定数量的预备测量值和固定数量的样本。使用
TimeExperiment类的limitingSamplingError方法构造一个具有指定统计目标(例如误差界限和置信水平)的计时试验。此外,您还可以指定预备测量值的数目以及最小和最大样本数。
您可以将性能测试作为回归测试运行。有关详细信息,请参阅使用类测试性能。
理解无效测试结果
在某些情况下,测试结果的 MeasurementResult 标为无效。当性能测试框架将 MeasurementResult 的 Valid 属性设置为 false 时,测试结果将标为无效。如果您的测试失败或被过滤掉,则会发生这种失效。另外,如果您的测试未正确使用 matlab.perftest.TestCase 的 startMeasuring 和 stopMeasuring 方法,则该测试的 MeasurementResult 将标为无效。
当性能测试框架遇到无效测试结果时,它的行为方式会有所不同,具体取决于计时试验的类型:
如果您创建的是不定次计时试验,则该框架会停止对该测试进行测量并移至下一个测试。
如果您创建的是定次计时试验,则该框架会继续采集指定数量的样本。
另请参阅
runperf | testsuite | matlab.perftest.TimeExperiment | matlab.perftest.TimeResult | matlab.unittest.measurement.MeasurementResult