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

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

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

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

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

Имя элемента комплекта, указанного как вектор символов. Этот аргумент фильтрует TestSuite элементы массива. Для среды тестирования, чтобы запустить тест, Name свойство тестового элемента должно совпадать с указанным именем. Используйте подстановочный символ, *, совпадать с любым количеством символов. Используйте символа вопросительного знака, ?, совпадать с отдельным символом.

Имя параметра используется элементом тестового набора, указанным как вектор символов. Этот аргумент фильтрует TestSuite элементы массива. Используйте подстановочный символ * совпадать с любым количеством символов. Используйте символа вопросительного знака, ? совпадать с отдельным символом.

Имя свойства параметризации используется элементом тестового набора, указанным как вектор символов. Этот аргумент фильтрует TestSuite элементы массива. Используйте подстановочный символ * совпадать с любым количеством символов. Используйте символа вопросительного знака, ? соответствовать к отдельному символу.

Имя процедуры тестирования, заданной как вектор символов. Этот аргумент фильтрует TestSuite элементы массива. Используйте подстановочный символ, *, совпадать с любым количеством символов. Используйте символа вопросительного знака, ?чтобы соответствовать только одному символу.

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

Имя класса, который тестовый класс выводит из, заданный как скаляр строки или вектор символов. Этот аргумент фильтрует TestSuite элементы массива.

Имя тестового тега элементов, заданного как вектор символов или скаляр строки. Этот аргумент фильтрует TestSuite элементы массива. Используйте подстановочный символ * совпадать с любым количеством символов. Используйте символа вопросительного знака, ? совпадать с отдельным символом.

Советы

  • Чтобы настроить статистические цели теста производительности, используйте TimeExperiment класс, чтобы создать и запустить тест производительности.

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

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

Введенный в R2016a