Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

スクリプトまたは関数を使用したパフォーマンスのテスト

この例では、4 通りのアプローチを使用して、ベクトルの事前割り当ての時間を計測するスクリプトベースまたは関数ベースのパフォーマンス テストを作成する方法を説明します。

パフォーマンス テストの記述

現在の作業フォルダー内にファイル preallocationTest.m としてパフォーマンス テストを作成します。この例では、次のスクリプトベースのテストまたは関数ベースのテストのいずれかを選択できます。この例の出力は、関数ベースのテストの出力です。スクリプトベースのテストを使用する場合は、テスト名が異なります。

スクリプトベースのパフォーマンス テスト関数ベースのパフォーマンス テスト
vectorSize = 1e7;

%% Ones Function
x = ones(1,vectorSize);

%% Indexing With Variable
id = 1:vectorSize;
x(id) = 1;

%% Indexing On LHS
x(1:vectorSize) = 1;

%% For Loop
for i=1:vectorSize
    x(i) = 1;
end
function tests = preallocationTest
tests = functiontests(localfunctions);
end

function testOnes(testCase)
vectorSize = getSize();
x = ones(1,vectorSize());
end

function testIndexingWithVariable(testCase)
vectorSize = getSize();
id = 1:vectorSize;
x(id) = 1;
end

function testIndexingOnLHS(testCase)
vectorSize = getSize();
x(1:vectorSize) = 1;
end

function testForLoop(testCase)
vectorSize = getSize();
for i=1:vectorSize
    x(i) = 1;
end
end

function vectorSize = getSize()
vectorSize = 1e7;
end

パフォーマンス テストの実行

runperf を使用してパフォーマンス テストを実行します。

results = runperf('preallocationTest.m')
Running preallocationTest
.......... .......... .......... ..
Done preallocationTest
__________


results = 

  1×4 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   4 Valid, 0 Invalid.
   10.2561 seconds testing time.

変数 results14 列の TimeResult 配列です。配列の各要素は、preallocationTest.m のコード セクションに定義されているテストの 1 つに対応します。

テスト結果の表示

2 番目のテストの測定結果を表示します。結果は異なる場合があります。

results(2)
ans = 

  TimeResult with properties:

            Name: 'preallocationTest/testIndexingWithVariable'
           Valid: 1
         Samples: [4×7 table]
    TestActivity: [8×12 table]

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

TestActivity プロパティのサイズで示されているとおり、パフォーマンス テスト フレームワークは 8 個の測定値を収集しました。この数の測定値には、コードをウォームアップするための 4 個の測定値が含まれています。Samples プロパティでは、ウォームアップ測定値は除外されます。

2 番目のテストのサンプル測定値を表示します。

results(2).Samples
>> results(2).Samples

ans =

  4×7 table

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

    preallocationTest/testIndexingWithVariable      0.15271       24-Jun-2019 16:13:33    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27
    preallocationTest/testIndexingWithVariable      0.15285       24-Jun-2019 16:13:33    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27
    preallocationTest/testIndexingWithVariable      0.15266       24-Jun-2019 16:13:33    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27
    preallocationTest/testIndexingWithVariable      0.15539       24-Jun-2019 16:13:34    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    9a6ee247-b49d-4e29-8b63-ba13c2eead27

単一のテスト要素の統計の計算

2 番目のテストの平均測定時間を表示します。ウォームアップ実行で収集されたデータを除外するには、Samples フィールドの値を使用します。

sampleTimes = results(2).Samples.MeasuredTime;
meanTest2 = mean(sampleTimes)
meanTest2 =

    0.1534

パフォーマンス テスト フレームワークは、2 番目のテストで 4 個のサンプル測定値を収集しました。テストには、平均 0.1534 秒かかりました。

すべてのテスト要素の統計の計算

すべてのテスト要素の平均時間を算出します。preallocationTest テストには、ones のベクトルを割り当てるための 4 つの異なるメソッドが含まれています。各メソッド (テスト要素) の時間を比較します。

パフォーマンス テスト フレームワークは各テスト要素の Samples テーブルを返すため、これらのテーブルをすべて 1 つのテーブルに連結します。次に、テスト要素 Name で行をグループ化し、各グループの平均 MeasuredTime を計算します。

fullTable = vertcat(results.Samples);
summaryStats = varfun(@mean,fullTable,...
    'InputVariables','MeasuredTime','GroupingVariables','Name')
summaryStats =

  4×3 table

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testOnes                        4             0.041072     
    preallocationTest/testIndexingWithVariable        4               0.1534     
    preallocationTest/testIndexingOnLHS               4              0.04677     
    preallocationTest/testForLoop                     4               1.0343     

統計目標値の変更とテストの再実行

時間実験を作成および実行することで、関数 runperf によって定義された統計目標値を変更します。信頼度 97% 以内、相対許容誤差 8% でサンプル平均に達する測定での時間実験を作成します。

明示的なテスト スイートを作成します。

suite = testsuite('preallocationTest');

可変数のサンプル測定により時間実験を構築して、テストを実行します。

import matlab.perftest.TimeExperiment
experiment = TimeExperiment.limitingSamplingError('NumWarmups',2,...
    'RelativeMarginOfError',0.08, 'ConfidenceLevel', 0.97);
resultsTE = run(experiment,suite);
Running preallocationTest
.......... .......... ....
Done preallocationTest
__________

すべてのテスト要素の統計を計算します。

fullTableTE = vertcat(resultsTE.Samples);
summaryStatsTE = varfun(@mean,fullTableTE,...
    'InputVariables','MeasuredTime','GroupingVariables','Name')
summaryStatsTE =

  4×3 table

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testOnes                        4             0.040484     
    preallocationTest/testIndexingWithVariable        4              0.15187     
    preallocationTest/testIndexingOnLHS               4             0.046224     
    preallocationTest/testForLoop                     4               1.0262     

参考

| | | |