Мера, быстро выполняющая тестовый код

Тесты производительности, которые выполняются слишком быстро для 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

Смотрите также

|

Похожие темы

Была ли эта тема полезной?