Тесты производительности, которые выполняются слишком быстро для MATLAB®, чтобы измериться точно, отфильтрованы с отказом предположения. С методом matlab.perftest.TestCase.keepMeasuring
среда тестирования может измерить значительно более быстрый код путем автоматического определения числа раз, чтобы выполнить итерации через код и измерения среднего уровня.
В вашей текущей рабочей папке создайте основанный на классах тест, PreallocationTest.m
, который сравнивает различные методы предварительного выделения. Поскольку методы тестирования включают проверки, используют startMeasuring
и методы stopMeasuring
, чтобы задать контуры для кода, который вы хотите измерить.
classdef PreallocationTest < matlab.perftest.TestCase methods(Test) function testOnes(testCase) testCase.startMeasuring x = ones(1,1e5); testCase.stopMeasuring testCase.verifyEqual(size(x),[1 1e5]) end function testIndexingWithVariable(testCase) import matlab.unittest.constraints.IsSameSetAs testCase.startMeasuring id = 1:1e5; x(id) = 1; testCase.stopMeasuring testCase.verifyThat(x,IsSameSetAs(1)) end function testIndexingOnLHS(testCase) import matlab.unittest.constraints.EveryElementOf import matlab.unittest.constraints.IsEqualTo testCase.startMeasuring x(1:1e5) = 1; testCase.stopMeasuring testCase.verifyThat(EveryElementOf(x),IsEqualTo(1)) end function testForLoop(testCase) testCase.startMeasuring for i=1:1e5 x(i) = 1; end testCase.stopMeasuring testCase.verifyNumElements(x,1e5) end end end
Запустите PreallocationTest
как тест производительности. Три теста отфильтрованы, потому что измерения слишком близки с точностью среды.
results = runperf('PreallocationTest');
Running PreallocationTest ........ ================================================================================ PreallocationTest/testOnes was filtered. Test Diagnostic: The MeasuredTime should not be too close to the precision of the framework. Details ================================================================================ .. ...... ================================================================================ PreallocationTest/testIndexingWithVariable was filtered. Test Diagnostic: The MeasuredTime should not be too close to the precision of the framework. Details ================================================================================ .... .... ================================================================================ PreallocationTest/testIndexingOnLHS was filtered. Test Diagnostic: The MeasuredTime should not be too close to the precision of the framework. Details ================================================================================ ...... .. Done PreallocationTest __________ Failure Summary: Name Failed Incomplete Reason(s) ========================================================================================= PreallocationTest/testOnes X Filtered by assumption. ----------------------------------------------------------------------------------------- PreallocationTest/testIndexingWithVariable X Filtered by assumption. ----------------------------------------------------------------------------------------- PreallocationTest/testIndexingOnLHS X Filtered by assumption.
Чтобы дать среде команду автоматически циклично выполняться через измеренный код и составлять в среднем результаты измерения, измените PreallocationTest
, чтобы использовать цикл keepMeasuring-while
вместо startMeasuring
и stopMeasuring
.
classdef PreallocationTest < matlab.perftest.TestCase methods(Test) function testOnes(testCase) while(testCase.keepMeasuring) x = ones(1,1e5); end testCase.verifyEqual(size(x),[1 1e5]) end function testIndexingWithVariable(testCase) import matlab.unittest.constraints.IsSameSetAs while(testCase.keepMeasuring) id = 1:1e5; x(id) = 1; end testCase.verifyThat(x,IsSameSetAs(1)) end function testIndexingOnLHS(testCase) import matlab.unittest.constraints.EveryElementOf import matlab.unittest.constraints.IsEqualTo while(testCase.keepMeasuring) x(1:1e5) = 1; end testCase.verifyThat(EveryElementOf(x),IsEqualTo(1)) end function testForLoop(testCase) while(testCase.keepMeasuring) for i=1:1e5 x(i) = 1; end end testCase.verifyNumElements(x,1e5) end end end
Повторно выполните тесты. Все завершенные тесты.
results = runperf('PreallocationTest');
Running PreallocationTest .......... .......... .......... .. Done PreallocationTest __________
Просмотрите результаты.
sampleSummary(results)
ans = 4×7 table Name SampleSize Mean StandardDeviation Min Median Max __________________________________________ __________ __________ _________________ __________ __________ __________ PreallocationTest/testOnes 4 2.8644e-05 7.5098e-07 2.7967e-05 2.8513e-05 2.9583e-05 PreallocationTest/testIndexingWithVariable 4 0.00042645 3.877e-06 0.00042382 0.00042492 0.00043212 PreallocationTest/testIndexingOnLHS 4 4.2269e-05 2.5913e-07 4.1886e-05 4.2367e-05 4.2457e-05 PreallocationTest/testForLoop 4 0.008932 0.00023528 0.0087702 0.008839 0.0092799
matlab.perftest.TestCase.keepMeasuring
| runperf