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

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

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

Создайте тест производительности в файле, 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.

Переменная results является массивом 1x4 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.

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

Отобразите демонстрационные измерения для второго теста.

results(2).Samples
ans =

  4×7 table

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

    preallocationTest/testIndexingWithVariable      0.18936       05-Oct-2018 15:02:48    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    590c7818-f956-4019-90fd-472e8ab823e0
    preallocationTest/testIndexingWithVariable      0.19051       05-Oct-2018 15:02:49    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    590c7818-f956-4019-90fd-472e8ab823e0
    preallocationTest/testIndexingWithVariable      0.20004       05-Oct-2018 15:02:49    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    590c7818-f956-4019-90fd-472e8ab823e0
    preallocationTest/testIndexingWithVariable      0.20118       05-Oct-2018 15:02:49    MY-HOSTNAME     win64      9.6.0.966561 (R2019a)    590c7818-f956-4019-90fd-472e8ab823e0

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

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

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

    0.1953

Среда тестирования производительности собрала 4 демонстрационных измерения для второго теста. Тест занял в среднем 0,1953 секунды.

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

Определите среднее время для всех тестовых элементов. Тест 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.056286     
    preallocationTest/testIndexingWithVariable        4              0.19527     
    preallocationTest/testIndexingOnLHS               4             0.061333     
    preallocationTest/testForLoop                     4              0.95081            

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

Измените статистические цели, заданные функцией 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.053506     
    preallocationTest/testIndexingWithVariable        4              0.19304     
    preallocationTest/testIndexingOnLHS               4             0.060781     
    preallocationTest/testForLoop                     4              0.92115     
       

Смотрите также

| | | |