exponenta event banner

runperf

Выполнить набор тестов для измерения производительности

Описание

results = runperf запускает все тесты в текущей папке для измерения производительности и возвращает массив matlab.perftest.TimeResult объекты. Каждый элемент в results соответствует элементу в наборе тестов.

В рамках теста производительности выполняются тесты с использованием переменного числа измерений для достижения среднего значения выборки с относительным пределом погрешности 0,05 в пределах доверительного уровня 0,95. Он выполняет тесты четыре раза, чтобы разогреть код, а затем от 4 до 256 раз, чтобы собрать измерения, которые соответствуют статистическим целям. Если среднее значение выборки не соответствует относительному пределу погрешности 0,05 в пределах доверительного уровня 0,95 после 256 тестовых запусков, система тестирования производительности прекращает выполнение теста и выводит предупреждение. В этом случае matlab.perftest.TimeResult объект содержит информацию для 4 прогонов и 256 прогонов измерений.

runperf функция обеспечивает простой способ выполнения набора тестов в качестве эксперимента производительности.

пример

results = runperf(tests) запускает указанный набор тестов.

пример

results = runperf(tests,Name,Value) запускает набор тестов с дополнительными опциями, указанными одним или несколькими Name,Value аргументы пары.

Примеры

свернуть все

В текущей рабочей папке создайте тест на основе сценария, onesTest.m, который использует три различных метода для инициализации 1000около-1500 матрица единиц.

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

Система тестирования рабочих характеристик провела четыре прогона, а затем четыре прогона измерений (указано как sample в Objective столбец).

Отображение среднего измеренного времени для второго теста. Для исключения данных, собранных в прогонах прогрева, используйте значения в Samples поле.

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

    0.3891

Чтобы сравнить различные методы инициализации в сценарии, просмотрите среднее измеренное время для всех тестов. Конкатенация значений из Samples по трем элементам в results массив. Затем использовать 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 функция была самым быстрым способом инициализации матрицы в единицы. Создана система тестирования производительности 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 класс - метод тестирования. Измерение времени для каждого метода испытания включает в себя весь код в методе. Для получения информации о назначении границ измерений см. startMeasuring и stopMeasuring методы matlab.perftest.TestCase.

Выполнить тесты производительности для всех элементов, которые содержат '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.

Отображение среднего измеренного времени для каждого из тестов. Конкатенация значений из Samples через два элемента в results массив. Затем использовать 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'})

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: runperf(tests,'Name','productA_*') запускает тестовые элементы с именем, начинающимся с 'productA_'.

Имя базовой папки, содержащей файл, определяющий тестовый класс, функцию или сценарий, указанный как строковый массив, символьный вектор или массив ячеек символьных векторов. Фильтры аргументов TestSuite элементы массива. Чтобы структура тестирования включала тест в набор, Test элемент должен содержаться в одной из базовых папок, указанных в BaseFolder. Если ни один из Test элементы соответствуют базовой папке, возвращается пустой набор тестов. Использовать подстановочный символ * для соответствия любому количеству символов. Использовать знак вопроса ? для соответствия одному символу. Для тестовых файлов, определенных в пакетах, базовая папка является родительской папкой пакета верхнего уровня.

Индикатор для выполнения тестов во вложенных папках, указанный как false или true (0 или 1). По умолчанию платформа выполняет тесты в указанных папках, но не во вложенных папках.

Типы данных: logical

Индикатор для выполнения тестов в подпакетах, указанный как false или true (0 или 1). По умолчанию платформа выполняет тесты в указанных пакетах, но не в их подпакетах.

Типы данных: logical

Имя элемента набора, указанное как строковый массив, символьный вектор или массив ячеек символьных векторов. Фильтры аргументов TestSuite элементы массива. Чтобы структура тестирования включала тест в набор, Name имущества Test элемент должен соответствовать одному из имен, указанных Name. Если ни один из Test элементы имеют соответствующее имя, возвращается пустой набор тестов. Использовать подстановочный символ * для соответствия любому количеству символов. Использовать знак вопроса ? для соответствия одному символу.

Имя свойства класса теста, определяющего параметр, используемый элементом набора тестов, указанный как строковый массив, символьный вектор или массив ячеек символьных векторов. Фильтры аргументов TestSuite элементы массива. Чтобы структура тестирования включала тест в набор, Parameterization имущества Test элемент должен содержать хотя бы одно из имен свойств, указанных ParameterProperty. Если ни один из Test элементы имеют соответствующее имя свойства, возвращается пустой набор тестов. Использовать подстановочный символ * для соответствия любому количеству символов. Использовать знак вопроса ? соответствует одному символу.

Имя параметра, используемого элементом набора тестов, заданного как строковый массив, символьный вектор или массив ячеек символьных векторов. MATLAB ® генерирует имена параметров на основе свойства класса теста, определяющего параметры:

  • Если значение свойства является массивом ячеек символьных векторов, MATLAB генерирует имена параметров из значений в массиве ячеек. В противном случае MATLAB определяет имена параметров как value1, value2, …, valueN.

  • Если значением свойства является структура, MATLAB генерирует имена параметров из полей структуры.

ParameterName фильтры аргументов TestSuite элементы массива. Чтобы структура тестирования включала тест в набор, Parameterization имущества Test элемент должен содержать хотя бы одно из имен параметров, указанных ParameterName. Если ни один из Test элементы имеют соответствующее имя параметра, возвращается пустой набор тестов. Использовать подстановочный символ * для соответствия любому количеству символов. Использовать знак вопроса ? для соответствия одному символу.

Имя процедуры тестирования, указанное как строковый массив, символьный вектор или массив ячеек символьных векторов. Фильтры аргументов TestSuite элементы массива. Чтобы структура тестирования включала тест в набор, ProcedureName имущества Test элемент должен соответствовать одному из имен процедур, указанных в ProcedureName. Если ни один из Test элементы имеют соответствующее имя процедуры, возвращается пустой набор тестов. Использовать подстановочный символ * для соответствия любому количеству символов. Использовать знак вопроса ? для соответствия одному символу.

В тесте на основе класса ProcedureName - имя метода тестирования. В функциональном тесте это имя локальной функции, содержащей тест. В тесте на основе сценария это имя, сгенерированное из заголовка раздела теста. В отличие от этого, Nameимя тестовой процедуры не включает имя класса или пакета, а также информацию о параметризации.

Имя класса, от которого происходит тестовый класс, указанное как строковый массив, символьный вектор или массив ячеек символьных векторов. Фильтры аргументов TestSuite элементы массива. Чтобы структура тестирования включала тест в набор, TestClass имущества Test элемент должен указывать на тестовый класс, производный от одного из классов, указанных Superclass. Если ни один из Test элементы соответствуют классу, возвращается пустой набор тестов.

Имя тега теста, используемого элементом набора тестов, заданного как строковый массив, символьный вектор или массив ячеек символьных векторов. Фильтры аргументов TestSuite элементы массива. Чтобы структура тестирования включала тест в набор, Tags имущества Test элемент должен содержать хотя бы одно из имен тегов, указанных Tag. Если ни один из Test элементы имеют соответствующее имя тега, возвращается пустой набор тестов. Использовать подстановочный символ * для соответствия любому количеству символов. Использовать знак вопроса ? для соответствия одному символу.

Совет

  • Для настройки статистических целей теста производительности используйте TimeExperiment класс для построения и выполнения теста производительности.

  • При использовании общих тестовых приборов в тестах и указании входных данных для runperf функционирует как строковый массив или массив ячеек символьных векторов, тестовый фреймворк сортирует массив, чтобы уменьшить общую настройку приспособления и операции обрыва. В результате тесты могут выполняться в порядке, отличном от порядка элементов во входном массиве. Дополнительные сведения см. в разделе sortByFixtures.

  • При записи тестов на основе классов можно запустить тесты как автономное приложение (требуется MATLAB Compiler™). Компиляция тестов производительности в настоящее время не поддерживается. Дополнительные сведения см. в разделе Компиляция модульных тестов MATLAB.

Альтернативы

Для явного создания набора тестов можно использовать testsuite функции или matlab.unittest.TestSuite методы создания набора. Затем можно запустить тест производительности с помощью run метод указанного вами TimeExperiment.

Представлен в R2016a