Этот пример показывает, как создать скрипт или функциональный тест производительности что времена предварительное выделение вектора с помощью четырех разных подходов.
Создайте тест производительности в файле, 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
matlab.perftest. TimeExperiment
| matlab.unittest.measurement. MeasurementResult
| runperf
| testsuite