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