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

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

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

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

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

Запустите тест производительности. В зависимости от вашей системы могут отличаться предупреждения, которые вы видите. В этом примере вывод среда тестирования производительности запустила  тест preallocationTest/testOnes максимальное количество времен, но это не достигло 0,05 относительных пределов погрешности с 0,95 доверительными уровнями.

results = runperf('preallocationTest.m')
Running preallocationTest
..........
..........
..........
......Warning: The target Relative Margin of Error was not met after running the MaxSamples for preallocationTest/testOnes.
....
..........
..........
..........
..........
.....
Done preallocationTest
__________


results = 

  1x4 MeasurementResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   4 Valid, 0 Invalid.

Переменная results является массивом 1x4 MeasurementResult. Каждый элемент в массиве соответствует одному из тестов, заданных в секции кода в preallocationTest.m m.

Отображение результатов тестирования

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

results(2)
ans = 

  MeasurementResult with properties:

            Name: 'preallocationTest/testIndexingWithVariable'
           Valid: 1
         Samples: [17x7 table]
    TestActivity: [21x12 table]

Totals:
   1 Valid, 0 Invalid.

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

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

results(2).Samples
ans = 

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

    preallocationTest/testIndexingWithVariable    0.12496         31-Dec-2015 06:29:38    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.16411         31-Dec-2015 06:29:39    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.13467         31-Dec-2015 06:29:39    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.14919         31-Dec-2015 06:29:39    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.13663         31-Dec-2015 06:29:39    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.12597         31-Dec-2015 06:29:39    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.13036         31-Dec-2015 06:29:39    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.17423         31-Dec-2015 06:29:40    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.13087         31-Dec-2015 06:29:40    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.13951         31-Dec-2015 06:29:40    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.12493         31-Dec-2015 06:29:40    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.12613         31-Dec-2015 06:29:40    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.15276         31-Dec-2015 06:29:40    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.16414         31-Dec-2015 06:29:41    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.13791         31-Dec-2015 06:29:41    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.12533         31-Dec-2015 06:29:41    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551
    preallocationTest/testIndexingWithVariable    0.12339         31-Dec-2015 06:29:41    MY-HOSTNAME    win64       9.0.0.320924 (R2016a)    e0f6e9a4-c41d-409b-a480-93fc30d88551

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

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

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

    0.1391

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

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

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

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

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

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testOnes                    32            0.031445         
    preallocationTest/testIndexingWithVariable    17             0.13912         
    preallocationTest/testIndexingOnLHS           23            0.071286         
    preallocationTest/testForLoop                  4             0.80677         

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

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

Измените статистические цели, заданные функцией 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 = 

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testOnes                    4             0.025568         
    preallocationTest/testIndexingWithVariable    6              0.12898         
    preallocationTest/testIndexingOnLHS           5             0.066603         
    preallocationTest/testForLoop                 4              0.78484         

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

| | |

Была ли эта тема полезной?