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

See Also

runperf | keepMeasuring

Topics