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

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

Тест эффективности

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

The results переменная является 1-by- 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 измерения. Это количество измерений включает четыре измерения для прогрева кода. The 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 второе.

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

Определите среднее время для всех тестовых элементов. The 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     

См. также

| | | |