Measure Fast Executing Test Code - MATLAB & Simulink (original) (raw)
Main Content
Performance tests that execute too quickly for MATLAB® to measure accurately are filtered with an assumption failure. With the keepMeasuring method, the testing framework can measure significantly faster code by automatically determining the number of times to iterate through code and measuring the average performance.
In your current working folder, create a class-based test,PreallocationTest.m
, that compares different methods of preallocation. Since the test methods include qualifications, use thestartMeasuring
and stopMeasuring
methods to define boundaries for the code you want to measure.
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
Run PreallocationTest
as a performance test. Two tests are filtered because the measurements are too close to the precision of the framework.
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/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/testIndexingOnLHS X Filtered by assumption.
To instruct the framework to automatically loop through the measured code and average the measurement results, modify PreallocationTest
to use a keepMeasuring-while
loop instead ofstartMeasuring
and 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
Rerun the tests. All the tests complete.
results = runperf('PreallocationTest');
Running PreallocationTest .......... .......... .......... .. Done PreallocationTest
View the results.
ans =
4×7 table
Name SampleSize Mean StandardDeviation Min Median Max
__________________________________________ __________ __________ _________________ __________ __________ __________
PreallocationTest/testOnes 4 3.0804e-05 1.8337e-07 3.0577e-05 3.0843e-05 3.0953e-05
PreallocationTest/testIndexingWithVariable 4 0.00044536 1.7788e-05 0.00042912 0.00044396 0.00046441
PreallocationTest/testIndexingOnLHS 4 5.6352e-05 1.8863e-06 5.5108e-05 5.5598e-05 5.9102e-05
PreallocationTest/testForLoop 4 0.0097656 0.00018202 0.0096181 0.0097065 0.010031