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