Main Content

클래스를 사용하여 성능 테스트하기

이 예제에서는 fprintf 함수에 대한 클래스 기반 성능 테스트와 회귀 테스트(Regression Test)를 생성하고 실행하는 방법을 보여줍니다.

성능 테스트 작성하기

다음 단위 (회귀) 테스트가 있다고 가정해 보겠습니다. runtests("fprintfTest") 대신 runperf("fprintfTest")를 사용하여 이 테스트를 성능 테스트로 실행할 수 있습니다.

classdef fprintfTest < matlab.unittest.TestCase
    properties
        file
        fid
    end
    methods(TestMethodSetup)
        function openFile(testCase)
            testCase.file = tempname;
            testCase.fid = fopen(testCase.file,'w');
            testCase.assertNotEqual(testCase.fid,-1,'IO Problem')
            
            testCase.addTeardown(@delete,testCase.file);
            testCase.addTeardown(@fclose,testCase.fid);
        end
    end
    
    methods(Test)
        function testPrintingToFile(testCase)
            textToWrite = repmat('abcdef',1,5000000);
            fprintf(testCase.fid,'%s',textToWrite);
            testCase.verifyEqual(fileread(testCase.file),textToWrite)
        end
        
        function testBytesToFile(testCase)
            textToWrite = repmat('tests_',1,5000000);
            nbytes = fprintf(testCase.fid,'%s',textToWrite);
            testCase.verifyEqual(nbytes,length(textToWrite))
        end
    end
end

이러한 작업이 Test 블록 내가 아니라 TestMethodSetup 블록 내에서 실행되므로 측정된 시간에는 파일을 열고 닫은 시간이나 어설션은 포함되지 않습니다. 하지만, 검증(Verification)을 수행한 시간은 측정 시간에 포함됩니다. 가장 좋은 접근 방식은 더 정확한 성능 범위를 측정하는 것입니다.

현재 폴더에서 fprintfTest.m이라는 파일에 성능 테스트를 생성합니다. 이 테스트는 다음과 같은 수정 사항이 적용된 회귀 테스트와 유사합니다.

  • 이 테스트는 matlab.perftest.TestCase 대신 matlab.unittest.TestCase로부터 상속됩니다.

  • 이 테스트는 startMeasuring 메서드와 stopMeasuring 메서드를 호출하여 fprintf 함수 호출 주위의 경계를 생성합니다.

classdef fprintfTest < matlab.perftest.TestCase
    properties
        file
        fid
    end
    methods(TestMethodSetup)
        function openFile(testCase)
            testCase.file = tempname;
            testCase.fid = fopen(testCase.file,'w');
            testCase.assertNotEqual(testCase.fid,-1,'IO Problem')
            
            testCase.addTeardown(@delete,testCase.file);
            testCase.addTeardown(@fclose,testCase.fid);
        end
    end
    
    methods(Test)
        function testPrintingToFile(testCase)
            textToWrite = repmat('abcdef',1,5000000);
            
            testCase.startMeasuring();
            fprintf(testCase.fid,'%s',textToWrite);
            testCase.stopMeasuring();
            
            testCase.verifyEqual(fileread(testCase.file),textToWrite)
        end
        
        function testBytesToFile(testCase)
            textToWrite = repmat('tests_',1,5000000);
            
            testCase.startMeasuring();
            nbytes = fprintf(testCase.fid,'%s',textToWrite);
            testCase.stopMeasuring();
            
            testCase.verifyEqual(nbytes,length(textToWrite))
        end
    end
end

이 성능 테스트의 측정 시간에는 fprintf에 대한 호출만 포함되며, 테스트 프레임워크는 계속해서 가설 검정(Qualification)을 실행합니다.

성능 테스트 실행하기

성능 테스트를 실행해 보십시오. 사용하는 시스템에 따라 성능 테스트 프레임워크가 테스트를 최대 횟수만큼 실행했지만 0.95 신뢰수준에 0.05 상대 오차 범위를 충족하지 못했다는 내용의 경고가 표시될 수 있습니다.

results = runperf("fprintfTest")
Running fprintfTest
.......... .......... ...
Done fprintfTest
__________


results = 

  1×2 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   2 Valid, 0 Invalid.
   3.6789 seconds testing time.

results 변수는 1×2 TimeResult 배열입니다. 배열 내의 각각의 요소는 테스트 파일에 정의되어 있는 각각의 테스트에 대응됩니다.

테스트 결과 표시하기

첫 번째 테스트에 대한 측정 결과를 표시해 보십시오. 사용자마다 결과는 여기에 표시된 것과 다를 수 있습니다.

results(1)
ans = 

  TimeResult with properties:

            Name: 'fprintfTest/testPrintingToFile'
           Valid: 1
         Samples: [4×7 table]
    TestActivity: [9×12 table]

Totals:
   1 Valid, 0 Invalid.
   2.7009 seconds testing time.

TestActivity 속성의 크기에서 볼 수 있듯이 9개의 측정값이 수집되었습니다. 이 측정값 개수에는 코드 워밍업 과정에서 얻어진 5개의 측정값이 포함됩니다. Samples 속성에서는 워밍업 측정값이 제외됩니다.

첫 번째 테스트에 대한 샘플 측정값을 표시해 보십시오.

results(1).Samples
ans =

  4×7 table

                 Name                 MeasuredTime         Timestamp             Host        Platform                 Version                             RunIdentifier            
    ______________________________    ____________    ____________________    ___________    ________    __________________________________    ____________________________________

    fprintfTest/testPrintingToFile       0.04193      14-Oct-2022 14:25:02    MY-HOSTNAME     win64      9.14.0.2081372 (R2023a) Prerelease    b8029663-5fbd-44e8-a5a6-06564ab18df6
    fprintfTest/testPrintingToFile       0.04148      14-Oct-2022 14:25:02    MY-HOSTNAME     win64      9.14.0.2081372 (R2023a) Prerelease    b8029663-5fbd-44e8-a5a6-06564ab18df6
    fprintfTest/testPrintingToFile      0.041849      14-Oct-2022 14:25:03    MY-HOSTNAME     win64      9.14.0.2081372 (R2023a) Prerelease    b8029663-5fbd-44e8-a5a6-06564ab18df6
    fprintfTest/testPrintingToFile      0.041969      14-Oct-2022 14:25:03    MY-HOSTNAME     win64      9.14.0.2081372 (R2023a) Prerelease    b8029663-5fbd-44e8-a5a6-06564ab18df6

단일 테스트 요소에 대한 통계량 계산하기

첫 번째 테스트에 대한 평균 측정 시간을 표시해 보십시오. 워밍업 실행에서 수집된 데이터를 제외하려면 Samples 속성의 값을 사용하십시오.

sampleTimes = results(1).Samples.MeasuredTime;
meanTest = mean(sampleTimes)
meanTest =

    0.0418

전체 테스트 요소에 대한 통계량 계산하기

fprintf에 대한 여러 호출을 비교하려면 results에서 요약 통계량 테이블을 만드십시오. 이 예제에서는 두 테스트 방법 모두 동일한 양의 데이터를 파일에 씁니다. 따라서 통계량 값 간에 차이가 나는 이유 중 일부는 출력 인수를 사용하여 fprintf 함수를 호출했기 때문입니다.

T = sampleSummary(results)
T =

  2×7 table

                 Name                 SampleSize      Mean      StandardDeviation      Min       Median       Max   
    ______________________________    __________    ________    _________________    ________    _______    ________

    fprintfTest/testPrintingToFile        4         0.041807       0.00022367         0.04148    0.04189    0.041969
    fprintfTest/testBytesToFile           9         0.044071         0.003268        0.041672    0.04223    0.049611

통계적 목표를 변경한 후 테스트를 다시 실행하기

시간 실험을 생성하고 실행하여 runperf 함수로 정의된 통계적 목표를 변경해 보십시오. 98% 신뢰수준에 2%의 상대 오차 범위를 갖는 표본평균을 충족하는 측정값을 사용하여 시간 실험을 생성하십시오. 4개의 워밍업 측정값과 최대 16개의 샘플 측정값을 수집하십시오.

테스트 스위트를 만듭니다.

suite = testsuite("fprintfTest");

지정된 요구 사항에 따라 시간 실험을 생성하고 테스트를 실행하십시오. 이 예제의 경우, 성능 테스트 프레임워크가 지정된 최대 샘플 수를 사용해 더 엄격한 통계적 목표를 충족할 수 없습니다. 사용자마다 결과는 여기에 표시된 것과 다를 수 있습니다.

import matlab.perftest.TimeExperiment
experiment = TimeExperiment.limitingSamplingError("NumWarmups",4, ...
    "MaxSamples",16,"RelativeMarginOfError",0.02,"ConfidenceLevel",0.98);
resultsTE = run(experiment,suite);
Running fprintfTest
.......... .......... ........Warning: Target Relative Margin of Error not met after running the MaxSamples for fprintfTest/testBytesToFile. 

Done fprintfTest
__________

최대 샘플 수를 32로 늘리고 시간 실험을 다시 실행하십시오.

experiment = TimeExperiment.limitingSamplingError("NumWarmups",4, ...
    "MaxSamples",32,"RelativeMarginOfError",0.02,"ConfidenceLevel",0.98);
resultsTE = run(experiment,suite);
Running fprintfTest
.......... .......... .......... .
Done fprintfTest
__________

테스트 요소에 대한 요약 통계량을 계산하십시오.

T1 = sampleSummary(resultsTE)
T1 =

  2×7 table

                 Name                 SampleSize      Mean      StandardDeviation      Min        Median       Max   
    ______________________________    __________    ________    _________________    ________    ________    ________

    fprintfTest/testPrintingToFile         4        0.041632       4.2448e-05        0.041578    0.041638    0.041674
    fprintfTest/testBytesToFile           19        0.042147        0.0016461        0.041428    0.041705    0.048784

최초 실행에 걸리는 시간 측정하기

새 MATLAB® 세션을 시작해 보십시오. 새 세션을 시작한다는 말은 MATLAB에서 테스트에 포함된 코드를 아직 실행하지 않았다는 것을 의미합니다.

워밍업 측정값이 0개이고 샘플 측정값이 하나인 고정 시간 실험을 생성하고 실행하여 코드에 대한 최초 실행에 걸리는 시간을 측정하십시오.

테스트 스위트를 만듭니다. 함수에 대한 최초 실행에 걸리는 시간을 측정하는 것이므로 단일 테스트를 실행합니다. 복수의 테스트를 실행하려면 다음 테스트를 실행하기 전에 이전 테스트의 결과를 저장한 후 새 MATLAB 세션을 시작해야 합니다.

suite = testsuite("fprintfTest/testPrintingToFile");

시간 실험을 생성하고 실행하십시오.

import matlab.perftest.TimeExperiment
experiment = TimeExperiment.withFixedSampleSize(1);
results = run(experiment,suite);
Running fprintfTest
.
Done fprintfTest
__________

결과를 표시합니다. TestActivity 테이블은 워밍업 측정값이 없음을 보여줍니다.

fullTable = results.TestActivity
fullTable =

  1×12 table

                 Name                 Passed    Failed    Incomplete    MeasuredTime    Objective         Timestamp             Host        Platform                 Version                            TestResult                         RunIdentifier            
    ______________________________    ______    ______    __________    ____________    _________    ____________________    ___________    ________    __________________________________    ______________________________    ____________________________________

    fprintfTest/testPrintingToFile    true      false       false         0.044004       sample      14-Oct-2022 14:32:51    MY-HOSTNAME     win64      9.14.0.2078117 (R2023a) Prerelease    1×1 matlab.unittest.TestResult    be5b0bfd-9b87-4498-9ef3-675c6889a85c

참고 항목

| | | |

관련 항목