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