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-by- 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
__________

Отображение результатов. The results переменная является 1-by- 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 элементы имеют совпадающее имя свойства, возвращается пустой тестовый набор. Используйте символ подстановки * для соответствия любому количеству символов. Используйте символа вопросительного знака ? чтобы соответствовать одному символу.

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

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

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

The 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