Main Content

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

runperf

一連のパフォーマンス測定テストを実行

説明

results = runperf は、パフォーマンス測定の目的で現在のフォルダー内にあるすべてのテストを実行し、matlab.perftest.TimeResult オブジェクトの配列を返します。results の各要素はテスト スイートの要素に対応します。

パフォーマンス テスト フレームワークは、可変の測定回数を使用してテストを実行し、信頼度 0.95 で相対許容誤差 0.05 のサンプル平均を求めます。テストを 4 回実行してコードをウォームアップし、次に 4 ~ 256 回実行して統計目標値を満たす測定値を収集します。256 回のテスト実行後にサンプル平均が信頼度 0.95 で相対許容誤差 0.05 を満たさない場合、パフォーマンス テスト フレームワークはテストの実行を停止して警告を表示します。この場合、matlab.perftest.TimeResult オブジェクトには 4 回のウォームアップ実行と 256 回の測定実行の情報が含まれます。

関数 runperf は、パフォーマンス実験として一連のテストを実行する簡単な方法を提供します。

results = runperf(tests) は、指定された一連のテストを実行します。

results = runperf(tests,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションを使用して、一連のテストを実行します。

すべて折りたたむ

現在の作業フォルダー内にスクリプト ベースのテスト onesTest.m を作成します。このテストは 3 つの異なるメソッドを使用して、10001500 列の 1 の行列を初期化します。

rows = 1000;
cols = 1500;

%% Ones Function
X = ones(rows,cols);

%% Loop Assignment Without Preallocation
for r = 1:rows
    for c = 1:cols
        X(r,c) = 1;
    end
end

%% Loop Assignment With Preallocation
X = zeros(rows,cols);
for r = 1:rows
    for c = 1:cols
        X(r,c) = 1;
    end
end

スクリプトをパフォーマンス テストとして実行します。結果は異なる場合があります。

results = runperf('onesTest');
Running onesTest
.......... .......... .......... .......... ..........
.......... .......... .......... .......... ....
Done onesTest
__________

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

results
results = 

  1×3 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

Totals:
   3 Valid, 0 Invalid.
   4.4113 seconds testing time.

2 番目のテストの測定結果を表示します。これは事前割り当てを行わずに代入をループしたものです。

results(2)
ans = 

  TimeResult with properties:

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

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

テスト測定値のテーブル全体を表示します。

results(2).TestActivity
results(2).TestActivity

ans =

  8×12 table

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

    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.39586        warmup      24-Jun-2019 16:50:25    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.38351        warmup      24-Jun-2019 16:50:25    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.37995        warmup      24-Jun-2019 16:50:25    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.38603        warmup      24-Jun-2019 16:50:26    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.38388        sample      24-Jun-2019 16:50:26    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.39803        sample      24-Jun-2019 16:50:27    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.39742        sample      24-Jun-2019 16:50:27    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d
    onesTest/LoopAssignmentWithoutPreallocation    true      false       false         0.37702        sample      24-Jun-2019 16:50:28    MY-HOSTNAME     win64      9.7.0.1141441 (R2019b) Prerelease Update 2    [1×1 matlab.unittest.TestResult]    ab95d893-a080-4e98-9297-df697882b09d

パフォーマンス テスト フレームワークはウォームアップ実行を 4 回実行し、次に測定実行 (Objective 列に sample として表示) を 4 回実行します。

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

mean(results(2).Samples.MeasuredTime)
ans =

    0.3891

スクリプト内の異なる初期化メソッドを比較するには、すべてのテストの平均測定時間を表示します。results 配列の 3 要素にわたって Samples フィールドの値を連結します。次に、varfun を使用して table エントリを名前でグループ化し、平均を計算します。

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

  3×3 table

                       Name                        GroupCount    mean_MeasuredTime
    ___________________________________________    __________    _________________

    onesTest/OnesFunction                              65            0.0063079    
    onesTest/LoopAssignmentWithoutPreallocation         4              0.38909    
    onesTest/LoopAssignmentWithPreallocation           13             0.018792    

出力例では、関数 ones が 1 の値からなる行列を初期化する最も速い方法でした。パフォーマンス テスト フレームワークはこのテストの測定実行を 65 回行いました。結果は異なる場合があります。

現在の作業フォルダーに、さまざまな事前割り当てメソッドを比較するクラスベースのテスト preallocationTest.m を作成します。

classdef preallocationTest < matlab.perftest.TestCase
    methods(Test)
        function testOnes(testCase)
            x = ones(1,1e7);
        end
        
        function testIndexingWithVariable(testCase)
            id = 1:1e7;
            x(id) = 1;
        end
        
        function testIndexingOnLHS(testCase)
            x(1:1e7) = 1;
        end
        
        function testForLoop(testCase)
            for i=1:1e7
                x(i) = 1;
            end
        end
        
    end
end

preallocationTest クラスの測定境界はテスト メソッドです。各テスト メソッドの時間測定には、メソッド内のすべてのコードが含まれます。測定境界の指定の詳細については、matlab.perftest.TestCasestartMeasuring メソッドおよび stopMeasuring メソッドを参照してください。

名前に 'Indexing' を含むすべての要素のパフォーマンス テストを実行します。結果は異なる可能性があり、runperf が統計目標値を満たさない場合は警告が表示されることもあります。

results = runperf('preallocationTest','Name','*Indexing*')
Running preallocationTest
.......... .......... .......
Done preallocationTest
__________


results = 

  1×2 TimeResult array with properties:

    Name
    Valid
    Samples
    TestActivity

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

各テストの平均測定時間を表示します。results 配列の 2 要素にわたって Samples フィールドの値を連結します。次に、varfun を使用して table エントリを名前でグループ化し、平均を計算します。

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

  2×3 table

                       Name                       GroupCount    mean_MeasuredTime
    __________________________________________    __________    _________________

    preallocationTest/testIndexingWithVariable         6             0.16337     
    preallocationTest/testIndexingOnLHS               13            0.049936     

入力引数

すべて折りたたむ

テスト スイート。string 配列、文字ベクトルまたは文字ベクトルの cell 配列として指定します。cell 配列の各文字ベクトルには、テスト ファイル、テスト クラス、テスト スイート要素、テスト クラスを含むパッケージ、テスト ファイルを含むフォルダー、あるいはテスト ファイルを含むプロジェクト フォルダーのそれぞれの名前を含めることができます。

例: runperf('ATestFile.m')

例: runperf('ATestFile/aTest')

例: runperf('mypackage.MyTestClass')

例: runperf(pwd)

例: runperf({'mypackage.MyTestClass','ATestFile.m',pwd,'mypackage.subpackage'})

名前と値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: runperf(tests,'Name','productA_*') は、'productA_' で始まる名前のテスト要素を実行します。

テスト クラス、関数またはスクリプトを定義するファイルを含むベース フォルダーの名前。string 配列、文字ベクトル、または文字ベクトルの cell 配列として指定します。この引数は、配列 TestSuite の要素をフィルター処理します。テスト フレームワークがスイートにテストを含めるためには、Test 要素が BaseFolder によって指定されたベース フォルダーの 1 つに含まれていなければなりません。Test 要素がいずれもベース フォルダーと一致しない場合、空のテスト スイートが返されます。ワイルドカード文字 * を使用すると、任意の数の文字と一致します。疑問符 ? を使用すると単一の文字と一致します。パッケージで定義したテスト ファイルでは、ベース フォルダーは最上位パッケージ フォルダーの親です。

サブフォルダー内のテストを実行するかどうかを示すインジケーター。false または true (0 または 1) として指定します。既定では、フレームワークは指定されたフォルダー内のテストを実行しますが、そのサブフォルダー内のテストは実行しません。

データ型: logical

サブパッケージ内のテストを実行するかどうかを示すインジケーター。false または true (0 または 1) として指定します。既定では、フレームワークは指定されたパッケージ内のテストを実行しますが、そのサブパッケージ内のテストは実行しません。

データ型: logical

スイート要素名。string 配列、文字ベクトルまたは文字ベクトルの cell 配列として指定します。この引数は、配列 TestSuite の要素をフィルター処理します。テスト フレームワークがスイートにテストを含めるためには、Test 要素の Name プロパティが Name によって指定された名前の 1 つと一致しなければなりません。Test 要素がいずれも一致する名前をもたない場合、空のテスト スイートが返されます。ワイルドカード文字 * を使用すると、任意の数の文字と一致します。疑問符 ? を使用すると単一の文字と一致します。

テスト スイート要素で使用されるパラメーターを定義するテスト クラス プロパティの名前。string 配列、文字ベクトルまたは文字ベクトルの cell 配列として指定します。この引数は、配列 TestSuite の要素をフィルター処理します。テスト フレームワークがスイートにテストを含めるためには、Test 要素の Parameterization プロパティに、ParameterProperty で指定されたプロパティ名が少なくとも 1 つ含まれていなければなりません。Test 要素がいずれも一致するプロパティ名をもたない場合、空のテスト スイートが返されます。ワイルドカード文字 * を使用すると、任意の数の文字と一致します。疑問符 ? を使用すると、単一の文字と一致します。

テスト スイート要素で使用されるパラメーターの名前。string 配列、文字ベクトルまたは文字ベクトルの cell 配列として指定します。MATLAB® は、パラメーターを定義するテスト クラス プロパティに基づいてパラメーター名を生成します。

  • プロパティ値が文字ベクトルの cell 配列である場合、MATLAB は、cell 配列の値からパラメーター名を生成します。それ以外の場合、MATLAB はパラメーター名を value1value2、…、valueN として指定します。

  • プロパティ値が構造体である場合、MATLAB はパラメーター名を構造体フィールドから生成します。

ParameterName 引数は、配列 TestSuite の要素をフィルター処理します。テスト フレームワークがスイートにテストを含めるためには、Test 要素の Parameterization プロパティに、ParameterName によって指定されたパラメーター名が少なくとも 1 つ含まれていなければなりません。Test 要素がいずれも一致するパラメーター名をもたない場合、空のテスト スイートが返されます。ワイルドカード文字 * を使用すると、任意の数の文字と一致します。疑問符 ? を使用すると単一の文字と一致します。

テスト プロシージャの名前。string 配列、文字ベクトルまたは文字ベクトルの cell 配列として指定します。この引数は、配列 TestSuite の要素をフィルター処理します。テスト フレームワークがスイートにテストを含めるためには、Test 要素の ProcedureName プロパティが ProcedureName によって指定されたプロシージャ名の 1 つと一致しなければなりません。Test 要素がいずれも一致するプロシージャ名をもたない場合、空のテスト スイートが返されます。ワイルドカード文字 * を使用すると、任意の数の文字と一致します。疑問符 ? を使用すると単一の文字と一致します。

クラスベースのテストでは、ProcedureName はテスト メソッドの名前です。関数ベースのテストでは、テストを含むローカル関数の名前です。スクリプトベースのテストでは、テスト セクション タイトルから生成された名前です。Name とは異なり、テスト プロシージャの名前には、クラスやパッケージの名前およびパラメーター化に関する情報は含まれません。

テスト クラスの派生元であるクラスの名前。string 配列、文字ベクトル、または文字ベクトルの cell 配列として指定します。この引数は、配列 TestSuite の要素をフィルター処理します。テスト フレームワークがスイートにテストを含めるためには、Test 要素の TestClass プロパティが Superclass によって指定されたクラスの 1 つから派生するテスト クラスを指していなければなりません。Test 要素がいずれもクラスに一致しない場合、空のテスト スイートが返されます。

テスト スイート要素で使用されるテスト タグの名前。string 配列、文字ベクトル、または文字ベクトルの cell 配列として指定します。この引数は、配列 TestSuite の要素をフィルター処理します。テスト フレームワークがスイートにテストを含めるためには、Test 要素の Tags プロパティに、Tag によって指定されたタグ名が少なくとも 1 つ含まれていなければなりません。Test 要素がいずれも一致するタグ名をもたない場合、空のテスト スイートが返されます。ワイルドカード文字 * を使用すると、任意の数の文字と一致します。疑問符 ? を使用すると単一の文字と一致します。

ヒント

  • パフォーマンス テストの統計目標値をカスタマイズするには、TimeExperiment クラスを使用してパフォーマンス テストを構成し実行します。

  • 共有テスト フィクスチャをテストで使用し、関数 runperf への入力を string 配列または文字ベクトルの cell 配列で指定する場合、テスト フレームワークは、共有フィクスチャのセットアップと破棄の操作を減らすために配列を並べ替えます。結果として、テストは入力配列内の要素の順序とは異なる順序で実行される可能性があります。詳細については、sortByFixtures を参照してください。

  • クラス ベースのテストを記述する場合、テストをスタンドアロン アプリケーションとして実行できます (MATLAB Compiler™ が必要です)。パフォーマンス テストのコンパイルは現在サポートされていません。詳細については、MATLAB ユニット テストのコンパイルを参照してください。

代替方法

テスト スイートを明示的に作成するには、関数 testsuite または matlab.unittest.TestSuite メソッドを使用してスイートを作成できます。次に、指定した TimeExperimentrun メソッドを使用してパフォーマンス テストを実行できます。

R2016a で導入