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). По умолчанию среда запускает тесты в заданных папках, но не в их подпапках.

Типы данных: логический

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

Типы данных: логический

Имя элемента набора в виде массива строк, вектора символов или массива ячеек из символьных векторов. Этот аргумент фильтрует 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