runperf

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

Синтаксис

results = runperf
results = runperf(tests)
results = runperf(tests,Name,Value)

Описание

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, который использует три различных метода, чтобы инициализировать матрицу 1000x1500 из единиц.

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 является массивом 1x3 TimeResult. Каждый элемент в массиве соответствует одному из тестов, заданных в секции кода в onesTest.m.

results
results = 

  1×3 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   3 Valid, 0 Invalid.

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

results(2)
ans = 

  TimeResult with properties:

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

Totals:
   1 Valid, 0 Invalid.

Отобразите заполненную таблицу тестовых измерений.

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.32388        warmup      05-Oct-2018 10:38:19    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.31146        warmup      05-Oct-2018 10:38:19    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.30751        warmup      05-Oct-2018 10:38:20    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.31201        warmup      05-Oct-2018 10:38:20    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.31579        sample      05-Oct-2018 10:38:20    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.30977        sample      05-Oct-2018 10:38:21    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.30909        sample      05-Oct-2018 10:38:21    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.30911        sample      05-Oct-2018 10:38:21    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    [1x1 matlab.unittest.TestResult]    b05f851b-8150-4b27-afc6-6cc917a90b9d

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

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

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

    0.3109

Чтобы сравнить различные методы инициализации в скрипте, отобразитесь, среднее значение измерило время для всех тестов. Конкатенация значений от поля Samples через эти три элемента в массиве results. Затем используйте varfun, чтобы сгруппировать записи таблицы по наименованию и вычислить среднее значение.

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

  3×3 table

                       Name                        GroupCount    mean_MeasuredTime
    ___________________________________________    __________    _________________

    onesTest/OnesFunction                               4            0.0084816    
    onesTest/LoopAssignmentWithoutPreallocation         4              0.31094    
    onesTest/LoopAssignmentWithPreallocation           37             0.025127         

В примере вывод функция ones была самым быстрым способом инициализировать матрицу к единицам. Среда тестирования производительности сделала 45 выполнений измерения для этого теста. Ваши результаты могут отличаться.

В вашей текущей рабочей папке создайте основанный на классах тест, 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 = 

  1x2 MeasurementResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   2 Valid, 0 Invalid.

Отобразитесь среднее значение измерило время для каждого из тестов. Конкатенация значений от поля Samples через эти два элемента в массиве results. Затем используйте varfun, чтобы сгруппировать записи таблицы по наименованию и вычислить среднее значение.

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

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testIndexingWithVariable     4             0.16637         
    preallocationTest/testIndexingOnLHS           30            0.076792         

Входные параметры

свернуть все

Комплект тестов, заданных как вектор символов или массив ячеек из символьных векторов. Каждый вектор символов в массиве ячеек может содержать имя тестового файла, тестового класса, имени элемента тестового набора, пакет, содержащий ваши тестовые классы, папка, содержащая ваши тестовые файлы или папку проекта, содержащую тестовые файлы.

Пример: runperf('ATestFile.m')

Пример: runperf('ATestFile/aTest')

Пример: runperf('mypackage.MyTestClass')

Пример: runperf(pwd)

Пример: runperf({'mypackage.MyTestClass','ATestFile.m',pwd,'mypackage.subpackage'})

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

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (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