Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

runperf

运行一组测试以进行性能测量

说明

results = runperf 将运行您的当前文件夹中用来进行性能测量的所有测试,并返回 matlab.perftest.TimeResult 对象的数组。results 中的每个元素对应于测试套件中的一个元素。

性能测试框架使用不定数量的测量值运行测试,使样本均值达到 0.95 置信水平的 0.05 相对误差界限的目标。它先运行 4 次测试以预备代码,然后再运行 4 到 256 次,以采集满足统计目标的测量值。如果运行 256 次测试之后,样本均值无法达到 0.95 置信水平的 0.05 相对误差界限的目标,则性能测试框架将停止运行测试并显示一条警告消息。在这种情况下,matlab.perftest.TimeResult 对象中包含 4 次预备运行和 256 次测量运行的信息。

runperf 函数提供了一种简单方法来运行一组测试以进行性能试验。

示例

results = runperf(tests) 运行一组指定的测试。

示例

results = runperf(tests,Name,Value) 通过由一个或多个 Name,Value 对组参数指定的附加选项运行一组测试。

示例

全部折叠

在您的当前工作文件夹中,创建一个基于脚本的测试 onesTest.m,它使用三种不同的方法来初始化 1000×1500 的全 1 矩阵。

rows = 1000;
cols = 1500;

%% Ones Function
X = ones(rows,cols);

%% Loop Assignment Without Preallocation
for r = 1:rows
    for c = 1:cols
        X(r,c) = 1;
    end
end

%% Loop Assignment With Preallocation
X = zeros(rows,cols);
for r = 1:rows
    for c = 1:cols
        X(r,c) = 1;
    end
end

运行脚本作为性能测试。您的结果可能有所不同。

results = runperf('onesTest');
Running onesTest
.......... .......... .......... .......... ..........
.......... .......... .......... .......... ....
Done onesTest
__________

显示结果。results 变量是 1×3 TimeResult 数组。数组中的每个元素对应于 onesTest.m 的代码节中定义的一个测试。

results
results = 

  1×3 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   3 Valid, 0 Invalid.
   4.4113 seconds testing time.

显示第二个测试的测量结果,该测试循环进行赋值,未进行预分配。

results(2)
ans = 

  TimeResult with properties:

            Name: 'onesTest/LoopAssignmentWithoutPreallocation'
           Valid: 1
         Samples: [4×7 table]
    TestActivity: [8×12 table]

Totals:
   1 Valid, 0 Invalid.
   3.1462 seconds testing time.

显示完整的测试测量值表。

results(2).TestActivity
results(2).TestActivity

ans =

  8×12 table

                       Name                        Passed    Failed    Incomplete    MeasuredTime    Objective         Timestamp             Host        Platform                     Version                                 TestResult                          RunIdentifier            
    ___________________________________________    ______    ______    __________    ____________    _________    ____________________    ___________    ________    __________________________________________    ________________________________    ____________________________________

    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.39586        warmup      24-Jun-2019 16:50:25    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.38351        warmup      24-Jun-2019 16:50:25    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.37995        warmup      24-Jun-2019 16:50:25    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.38603        warmup      24-Jun-2019 16:50:26    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.38388        sample      24-Jun-2019 16:50:26    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.39803        sample      24-Jun-2019 16:50:27    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.39742        sample      24-Jun-2019 16:50:27    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.37702        sample      24-Jun-2019 16:50:28    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d

性能测试框架运行 4 次进行预备,然后运行 4 次进行测量(由 Objective 列中的 sample 表示)。

显示第二个测试的测量时间均值。要排除在预备运行中采集的数据,请使用 Samples 字段中的值。

mean(results(2).Samples.MeasuredTime)
ans =

    0.3891

要比较脚本中的不同初始化方法,请显示所有测试的平均测量时间。串联 results 数组中三个元素的 Samples 字段的值。然后,使用 varfun 按名称对表格中的条目进行分组并计算均值。

fullTable = vertcat(results.Samples);
varfun(@mean,fullTable,'InputVariables','MeasuredTime','GroupingVariables','Name')
ans =

  3×3 table

                       Name                        GroupCount    mean_MeasuredTime
    ___________________________________________    __________    _________________

    onesTest/OnesFunction                              65            0.0063079    
    onesTest/LoopAssignmentWithoutPreallocation         4              0.38909    
    onesTest/LoopAssignmentWithPreallocation           13             0.018792    

在示例输出中,ones 函数是将矩阵初始化为 1 的最快方式。性能测试框架为此测试进行了 65 次测量运行。您的结果可能有所不同。

在您的当前工作文件夹中创建一个基于类的测试,preallocationTest.m,用于对不同的预分配方法进行比较。

classdef preallocationTest < matlab.perftest.TestCase
    methods(Test)
        function testOnes(testCase)
            x = ones(1,1e7);
        end
        
        function testIndexingWithVariable(testCase)
            id = 1:1e7;
            x(id) = 1;
        end
        
        function testIndexingOnLHS(testCase)
            x(1:1e7) = 1;
        end
        
        function testForLoop(testCase)
            for i=1:1e7
                x(i) = 1;
            end
        end
        
    end
end

preallocationTest 类的测量边界是测试方法。每个测试方法的时间测量包括该方法中的所有代码。有关指定测量边界的信息,请参阅 matlab.perftest.TestCasestartMeasuringstopMeasuring 方法。

对名称中包含 'Indexing' 的所有元素运行性能测试。您的结果可能有所不同,而且如果 runperf 不满足统计目标,您可能会看到一条警告消息。

results = runperf('preallocationTest','Name','*Indexing*')
Running preallocationTest
.......... .......... .......
Done preallocationTest
__________


results = 

  1×2 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   2 Valid, 0 Invalid.
   2.4858 seconds testing time.

显示每个测试的平均测量时间。串联 results 数组中两个元素的 Samples 字段的值。然后,使用 varfun 按名称对表格中的条目进行分组并计算均值。

fullTable = vertcat(results.Samples);
varfun(@mean,fullTable,'InputVariables','MeasuredTime','GroupingVariables','Name')
ans =

  2×3 table

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testIndexingWithVariable         6             0.16337     
    preallocationTest/testIndexingOnLHS               13            0.049936     

输入参数

全部折叠

测试套件,指定为字符串数组、字符向量或字符向量元胞数组。元胞数组中的每个字符向量均可包含测试文件的名称、测试类、测试套件元素、包含您的测试类的包、包含您的测试文件的文件夹或者包含测试文件的工程文件夹的名称。

示例: runperf('ATestFile.m')

示例: runperf('ATestFile/aTest')

示例: runperf('mypackage.MyTestClass')

示例: runperf(pwd)

示例: runperf({'mypackage.MyTestClass','ATestFile.m',pwd,'mypackage.subpackage'})

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: runperf(tests,'Name','productA_*') 运行名称以 'productA_' 开头的测试元素。

包含用于定义测试类、函数或脚本的文件的基本文件夹的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参数过滤 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素必须包含在 BaseFolder 指定的基本文件夹之一中。如果没有 Test 元素与基本文件夹匹配,将返回空测试套件。使用通配符 * 以匹配任何数量的字符。使用问号字符 ? 只匹配一个字符。对于包中定义的测试文件,基本文件夹是顶级包文件夹的父级。

指示是否运行子文件夹中测试的指示符,指定为 falsetrue01)。默认情况下,框架只运行指定文件夹(而不包含其子文件夹)中的测试。

指示是否运行子包中的测试的指示符,指定为 falsetrue01)。默认情况下,框架只运行指定包(而不包含其子包)中的测试。

测试套件元素的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参数过滤 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素的 Name 属性必须匹配 Name 指定的名称之一。如果 Test 元素都没有匹配的名称,将返回空测试套件。使用通配符 * 以匹配任何数量的字符。使用问号字符 ? 只匹配一个字符。

对于一个给定的测试文件,测试套件元素的名称唯一地标识测试内容的最小可运行部分。它包括包名称、文件名(不包括扩展名)、过程名称和有关参数化的信息。

定义测试套件元素使用的参数的测试类属性的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参数过滤 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素的 Parameterization 属性必须包含 ParameterProperty 指定的至少一个属性名称。如果 Test 元素都没有匹配的属性名称,将返回空测试套件。使用通配符 * 以匹配任何数量的字符。使用问号字符 ? 只匹配一个字符。

测试套件元素使用的参数的名称,指定为字符串数组、字符向量或字符向量元胞数组。MATLAB® 根据定义参数的测试类属性生成参数名称:

  • 如果属性值是字符向量元胞数组,MATLAB 将根据元胞数组中的值生成参数名称。否则,MATLAB 将参数名称指定为 value1value2、…、valueN

  • 如果属性值是结构体,则 MATLAB 将根据结构体字段生成参数名称。

ParameterName 参数过滤 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素的 Parameterization 属性必须包含 ParameterName 指定的至少一个参数名称。如果 Test 元素都没有匹配的参数名称,将返回空测试套件。使用通配符 * 以匹配任何数量的字符。使用问号字符 ? 只匹配一个字符。

测试过程的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参数过滤 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素的 ProcedureName 属性必须匹配 ProcedureName 指定的过程名称之一。如果 Test 元素都没有匹配的过程名称,将返回空测试套件。使用通配符 * 以匹配任何数量的字符。使用问号字符 ? 只匹配一个字符。

在基于类的测试中,测试过程的名称是包含该测试的 Test 方法的名称。在基于函数的测试中,它是包含测试的局部函数的名称。在基于脚本的测试中,它是从测试部分标题生成的名称。与测试套件元素的名称不同,测试过程的名称不包括任何包名称、文件名或关于参数化的信息。

派生测试类的父类的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参数过滤 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素的 TestClass 属性必须指向从 Superclass 指定的类之一派生的一个测试类。如果没有 Test 元素与类匹配,将返回空测试套件。

测试套件元素使用的测试标记的名称,指定为字符串数组、字符向量或字符向量元胞数组。此参数过滤 TestSuite 数组元素。要使测试框架包含套件中的一个测试,Test 元素的 Tags 属性必须包含 Tag 指定的至少一个标记名称。如果 Test 元素都没有匹配的标记名称,将返回空测试套件。使用通配符 * 以匹配任何数量的字符。使用问号字符 ? 只匹配一个字符。

提示

  • 要自定义性能测试的统计目标,请使用 TimeExperiment 类来构造和运行性能测试。

  • 当您在测试中使用共享测试脚手架并将 runperf 函数的输入指定为字符串数组或字符向量元胞数组时,测试框架会对数组进行排序,以减少共享脚手架的设置和拆解操作。因此,测试运行的顺序可能不同于输入数组中元素的顺序。有关详细信息,请参阅 sortByFixtures

  • 编写基于类的测试时,可以将测试作为独立应用程序运行(需要 MATLAB Compiler™)。当前不支持编译性能测试。有关详细信息,请参阅编译 MATLAB 单元测试

备选方法

要显式创建测试套件,您可以使用 testsuite 函数或 matlab.unittest.TestSuite 方法,它会创建一个套件。然后,您可以使用指定的 TimeExperimentrun 方法运行性能测试。

版本历史记录

在 R2016a 中推出

全部展开