exponenta event banner

Тестирование производительности с использованием сценариев или функций

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

Тест производительности записи

Создайте тест производительности в файле, preallocationTest.m, в текущей рабочей папке. В этом примере можно использовать либо следующий тест на основе сценария, либо функциональный тест. Выходные данные в этом примере предназначены для функционального теста. При использовании теста на основе сценария имена тестов будут отличаться.

Тестирование производительности на основе сценариевФункциональный тест производительности
vectorSize = 1e7;

%% Ones Function
x = ones(1,vectorSize);

%% Indexing With Variable
id = 1:vectorSize;
x(id) = 1;

%% Indexing On LHS
x(1:vectorSize) = 1;

%% For Loop
for i=1:vectorSize
    x(i) = 1;
end
function tests = preallocationTest
tests = functiontests(localfunctions);
end

function testOnes(testCase)
vectorSize = getSize();
x = ones(1,vectorSize());
end

function testIndexingWithVariable(testCase)
vectorSize = getSize();
id = 1:vectorSize;
x(id) = 1;
end

function testIndexingOnLHS(testCase)
vectorSize = getSize();
x(1:vectorSize) = 1;
end

function testForLoop(testCase)
vectorSize = getSize();
for i=1:vectorSize
    x(i) = 1;
end
end

function vectorSize = getSize()
vectorSize = 1e7;
end

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

Запустите тест производительности с помощью runperf.

results = runperf('preallocationTest.m')
Running preallocationTest
.......... .......... .......... ..
Done preallocationTest
__________


results = 

  1×4 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   4 Valid, 0 Invalid.
   10.2561 seconds testing time.

results переменная является 1около-4 TimeResult массив. Каждый элемент в массиве соответствует одному из тестов, определенных в разделе кода в preallocationTest.m.

Просмотр результатов тестирования

Просмотрите результаты измерений для второго теста. Ваши результаты могут отличаться.

results(2)
ans = 

  TimeResult with properties:

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

Totals:
   1 Valid, 0 Invalid.
   1.2274 seconds testing time.

Как указано размером TestActivity свойство, собранная структура тестирования производительности 8 измерения. Это количество измерений включает четыре измерения для прогрева кода. Samples свойство исключает измерения прогрева.

Просмотрите результаты измерений проб для второго теста.

results(2).Samples
>> results(2).Samples

ans =

  4×7 table

                       Name                       MeasuredTime         Timestamp             Host        Platform                     Version                                 RunIdentifier            
    __________________________________________    ____________    ____________________    ___________    ________    __________________________________________    ____________________________________

    preallocationTest/testIndexingWithVariable      0.15271       24-Jun-2019 16:13:33    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27
    preallocationTest/testIndexingWithVariable      0.15285       24-Jun-2019 16:13:33    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27
    preallocationTest/testIndexingWithVariable      0.15266       24-Jun-2019 16:13:33    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27
    preallocationTest/testIndexingWithVariable      0.15539       24-Jun-2019 16:13:34    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27

Статистика вычислений для одного тестового элемента

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

sampleTimes = results(2).Samples.MeasuredTime;
meanTest2 = mean(sampleTimes)
meanTest2 =

    0.1534

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

Вычислить статистику для всех тестовых элементов

Определите среднее время для всех тестовых элементов. preallocationTest тест включает в себя четыре различных способа распределения вектора из них. Сравните время для каждого метода (тестовый элемент).

Поскольку платформа тестирования производительности возвращает Samples для каждого тестового элемента объедините все эти таблицы в одну таблицу. Затем сгруппируйте строки по контрольному элементу Nameи вычислить среднее значение MeasuredTime для каждой группы.

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

  4×3 table

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testOnes                        4             0.041072     
    preallocationTest/testIndexingWithVariable        4               0.1534     
    preallocationTest/testIndexingOnLHS               4              0.04677     
    preallocationTest/testForLoop                     4               1.0343     

Изменение статистических целей и повторный запуск тестов

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

Создайте явный набор тестов.

suite = testsuite('preallocationTest');

Создайте временной эксперимент с переменным количеством измерений образцов и выполните тесты.

import matlab.perftest.TimeExperiment
experiment = TimeExperiment.limitingSamplingError('NumWarmups',2,...
    'RelativeMarginOfError',0.08, 'ConfidenceLevel', 0.97);
resultsTE = run(experiment,suite);
Running preallocationTest
.......... .......... ....
Done preallocationTest
__________

Вычислите статистику для всех тестовых элементов.

fullTableTE = vertcat(resultsTE.Samples);
summaryStatsTE = varfun(@mean,fullTableTE,...
    'InputVariables','MeasuredTime','GroupingVariables','Name')
summaryStatsTE =

  4×3 table

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testOnes                        4             0.040484     
    preallocationTest/testIndexingWithVariable        4              0.15187     
    preallocationTest/testIndexingOnLHS               4             0.046224     
    preallocationTest/testForLoop                     4               1.0262     

См. также

| | | |