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