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