主要内容

使用类测试性能

这个例子展示了如何创建一个性能测试和回归测试函数。

编写性能测试

考虑下面的单元(回归)测试。您可以使用以下命令作为性能测试运行此测试runperf(“fprintfTest”)而不是runtests(“fprintfTest”)

classdeffprintfTest < matlab.unittest.TestCase属性文件支撑材结束方法(TestMethodSetup)函数openFile (testCase) testCase。文件= tempname;testCase。fid = fopen (testCase.file,' w ');testCase.assertNotEqual (testCase.fid 1“IO问题”) testCase.addTeardown (@delete testCase.file);testCase.addTeardown (@fclose testCase.fid);结束结束方法(测试)函数testPrintingToFile(testCase) textToWrite = repmat(“六边形abcdef”, 1, 5000000);流(testCase.fid' % s ', textToWrite);testCase.verifyEqual (fileread (testCase.file)、textToWrite)结束函数testbytestfile (testCase) textToWrite = repmat(“tests_”, 1, 5000000);nbytes =流(testCase.fid,' % s ', textToWrite);testCase.verifyEqual (nbytes长度(textToWrite))结束结束结束

所测量的时间不包括打开和关闭文件或断言的时间,因为这些活动发生在TestMethodSetup块,而不是在测试块。然而,测量的时间包括执行验证的时间。最佳实践是度量一个更精确的性能边界。

在文件中创建性能测试,fprintfTest.m,在当前工作文件夹中。该测试类似于回归测试,只是做了以下修改:

  • 测试继承自matlab.perftest.TestCase而不是matlab.unittest.TestCase

  • 测试调用startMeasuringstopMeasuring方法创建边界函数调用。

classdeffprintfTest < matlab.perftest.TestCase属性文件支撑材结束方法(TestMethodSetup)函数openFile (testCase) testCase。文件= tempname;testCase。fid = fopen (testCase.file,' w ');testCase.assertNotEqual (testCase.fid 1“IO问题”) testCase.addTeardown (@delete testCase.file);testCase.addTeardown (@fclose testCase.fid);结束结束方法(测试)函数testPrintingToFile(testCase) textToWrite = repmat(“六边形abcdef”, 1, 5000000);testCase.startMeasuring ();流(testCase.fid' % s ', textToWrite);testCase.stopMeasuring ();testCase.verifyEqual (fileread (testCase.file)、textToWrite)结束函数testbytestfile (testCase) textToWrite = repmat(“tests_”, 1, 5000000);testCase.startMeasuring ();nbytes =流(testCase.fid,' % s ', textToWrite);testCase.stopMeasuring ();testCase.verifyEqual (nbytes长度(textToWrite))结束结束结束

此性能测试的测量时间仅包括调用,测试框架仍然评估资格。

运行性能测试

运行性能测试。根据您的系统,您可能会看到性能测试框架运行测试的最大次数的警告,但没有达到0.05a的相对误差幅度0.95信心水平。

结果= runperf (“fprintfTest”
运行fprintfTest .......... .......... .完成fprintfTest __________ results = 1×2 TimeResult数组的属性:Name Valid Samples TestActivity总计:2 Valid, 0 Invalid. 4.1417秒测试时间。

结果变量是一个1——- - - - - -2TimeResult数组中。数组中的每个元素都对应于测试文件中定义的一个测试。

显示测试结果

显示第一次测试的测量结果。结果可能会有所不同。

结果(1)
ans = timerresult with properties: Name: 'fprintfTest/testPrintingToFile' Valid: 1 Samples: [4×7 table] TestActivity: [8×12 table]总计:1 Valid, 0 Invalid. 2.7124秒测试时间。

如尺寸所示TestActivity属性,则性能测试框架收集8测量。这个数字包括4为代码热身的度量。的样品属性不包括热身测量。

显示第一次测试的样品尺寸。

结果(1)。样品
ans = 4×7表名MeasuredTime时间戳RunIdentifier主机平台版本  ______________________________ ____________ ____________________ ___________ ________ __________________________________________ ____________________________________ fprintfTest / testPrintingToFile 0.067729截止2019年6月24日16:22:09 MY-HOSTNAME win64 9.7.0.1141441 (R2019b)pre - release Update 2 62991eef-5570-47b0-ade5-b8a805245e8f fprintfTest/testPrintingToFile 0.067513 24- june -2019 16:22:09 MY-HOSTNAME win64 9.7.0.1141441 (R2019b) Prerelease Update 26月24日16:22:10 MY-HOSTNAME win64 9.7.0.1141441 (R2019b)预发布更新2

计算单个测试元素的统计信息

显示第一次测试的平均测量时间。要排除在预热运行中收集的数据,请使用样品字段。

sampleTimes =结果(1).Samples.MeasuredTime;意味着=意味着(sampleTimes)
意味着= 0.0681

计算所有测试元素的统计信息

确定所有测试元素的平均时间。的fprintfTest测试包括两种不同的方法。比较每个方法(测试元素)的时间。

由于性能测试框架返回样品表,将所有这些表连接到一个表中。然后按测试元素对行进行分组的名字,并计算均值MeasuredTime为每个组。

fullTable = vertcat (results.Samples);summaryStats = varfun (@mean fullTable,...“数据源”“MeasuredTime”“GroupingVariables”“名字”
summaryStats = 2×3表名GroupCount mean_MeasuredTime  ______________________________ __________ _________________ fprintfTest / testPrintingToFile 4 0.068139 fprintfTest / testBytesToFile 0.071595 9

这两种测试方法向文件写入相同数量的数据。因此,平均值之间的一些差异归因于调用函数带有输出参数。

更改统计目标和重新运行测试

变更。定义的统计目标runperf通过构造和运行时间实验来实现。构造一个时间实验,用测量值达到样本均值3%相对误差范围在97%信心水平。收集4热身测量,直到16样品测量。

构建一个明确的测试套件。

套件= testsuite (“fprintfTest”);

构建一个带有可变数量样本测量值的时间实验,并运行测试。

进口matlab.perftest.TimeExperiment实验= TimeExperiment.limitingSamplingError (“NumWarmups”,4,...“MaxSamples”, 16岁,“RelativeMarginOfError”, 0.03,“ConfidenceLevel”, 0.97);resultsTE =运行(实验套件);
运行fprintfTest .......... ..........警告:在运行MaxSamples for fprintfTest/testPrintingToFile后,目标相对错误幅度未达到。……完成fprintfTest  __________

在这个示例输出中,性能测试框架不能满足更严格的统计目标与指定数量的最大样本。结果可能会有所不同。

计算所有测试元素的统计信息。

fullTableTE = vertcat (resultsTE.Samples);summaryStatsTE = varfun (@mean fullTableTE,...“数据源”“MeasuredTime”“GroupingVariables”“名字”
summaryStatsTE = 2×3表名GroupCount mean_MeasuredTime  ______________________________ __________ _________________ fprintfTest / testPrintingToFile 16 0.069482 fprintfTest / testBytesToFile 4 0.067902

将样品的最大数量增加到32然后重新做时间实验。

实验= TimeExperiment.limitingSamplingError (“NumWarmups”,4,...“MaxSamples”32岁的“RelativeMarginOfError”, 0.03,“ConfidenceLevel”, 0.97);resultsTE =运行(实验套件);
运行fprintfTest .......... ......完成fprintfTest  __________

计算所有测试元素的统计信息。

fullTableTE = vertcat (resultsTE.Samples);summaryStatsTE = varfun (@mean fullTableTE,...“数据源”“MeasuredTime”“GroupingVariables”“名字”
summaryStatsTE = 2×3表名GroupCount mean_MeasuredTime  ______________________________ __________ _________________ fprintfTest / testPrintingToFile 4 0.067228 fprintfTest / testBytesToFile 4 0.067766

测试框架实现了两个测试的统计目标4样本。

测量第一次成本

开始一个新的MATLAB®会话。新的会话确保MATLAB没有运行测试中包含的代码。

通过创建和运行一个固定时间的实验来度量代码的首次成本,该实验没有预热度量,只有一个示例度量。

构建一个明确的测试套件。由于您正在度量函数的首次成本,因此运行单个测试。要运行多个测试,请保存结果并在测试之间启动新的MATLAB会话。

套件= testsuite (“fprintfTest / testPrintingToFile”);

构建并运行时间实验。

进口matlab.perftest.TimeExperiment实验= TimeExperiment.withFixedSampleSize (1);结果=运行(实验套件);
fprintfTest运行。完成fprintfTest  __________

显示结果。观察TestActivity表中确保无预热样品。

fullTable =结果。TestActivity
fullTable = 1×12表名传递失败不完整MeasuredTime客观时间戳主机平台版本TestResult RunIdentifier  ______________________________ ______ ______ __________ ____________ _________ ____________________ ___________ ________ __________________________________________ ____________________________________________________________________ fprintfTest/testPrintingToFile true false false 0.071754 sample 24- june -2019 16:31:27 MY-HOSTNAME win64 9.7.0.1141441 (R2019b) Prerelease Update 2 [1×1 matlab.unittest. txt]TestResult] 045394 eb - e722 - 4241 - 8 da2 - 1 - d17a97ac90a

性能测试框架为每个测试收集一个样本。

另请参阅

|||||