Main Content

Measure Fast Executing Test Code

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 the startMeasuring 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 of startMeasuring 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.

sampleSummary(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

|

Related Topics