パフォーマンス テストのフレームワークの概要
パフォーマンス テストのインターフェイスには、スクリプトベース、関数ベースおよびクラスベースのユニット テスト インターフェイスが使用されます。パフォーマンス テスト内で検定を実行することで、コードのパフォーマンスを測定しながら正しい機能的動作も確保できます。また、パフォーマンス テストを標準の回帰テストとして実行し、コードの変更によってパフォーマンス テストが中断されないようにすることもできます。
測定対象コードの範囲の判別
次の表は、それぞれのタイプのテストで、どのコードが測定されるかを示しています。
| テストのタイプ | 測定対象 | 除外対象 |
|---|---|---|
| スクリプトベース | スクリプトの各セクション内のコード |
|
| 関数ベース | 各テスト関数内のコード |
|
| クラスベース | Test 属性でタグ付けされた各メソッド内のコード |
|
matlab.perftest.TestCase から派生していて、startMeasuring メソッドと stopMeasuring メソッドを使用しているクラスベース | Test 属性でタグ付けされた各メソッド内の、startMeasuring の呼び出しから stopMeasuring の呼び出しまでのコード |
|
matlab.perftest.TestCase から派生し keepMeasuring メソッドを使用するクラスベース | Test 属性でタグ付けされた各メソッドの各 keepMeasuring-while ループ内のコード |
|
時間実験のタイプ
2 つのタイプの時間実験を作成できます。
"頻度論的時間実験" は、指定された許容誤差および信頼度を達成するために可変数の測定値を収集します。頻度論的時間実験を使用すると、測定サンプルの統計目標値を定義できます。この実験は、関数
runperfまたはTimeExperimentクラスのlimitingSamplingError静的メソッドを使用して生成します。"固定回数時間実験" は、固定数の測定値を収集します。固定回数時間実験を使用して、コードの初期コストを測定したり、サンプルのサイズを明示的に制御したりすることができます。この実験は、
TimeExperimentクラスのwithFixedSampleSize静的メソッドを使用して生成します。
次の表は、頻度論的時間実験と固定回数時間実験の相違点をまとめています。
| 頻度論的時間実験 | 固定回数時間実験 | |
|---|---|---|
| ウォームアップ測定 | 既定では 5 だが、TimeExperiment.limitingSamplingError で設定可能 | 既定では 0 だが、TimeExperiment.withFixedSampleSize で設定可能 |
| サンプル数 | 既定では 4 ~ 256 だが、TimeExperiment.limitingSamplingError で設定可能 | 実験の作成時に定義される |
| 相対許容誤差 | 既定では 5% だが、TimeExperiment.limitingSamplingError で設定可能 | 該当なし |
| 信頼度 | 既定では 95% だが、TimeExperiment.limitingSamplingError で設定可能 | 該当なし |
| 無効なテスト結果に対するフレームワークの動作 | テストの測定を停止し、次のテストに移る | 指定されたサンプル数を収集する |
測定範囲のあるパフォーマンス テストの記述
クラスベースのテストが matlab.perftest.TestCase ではなく matlab.unittest.TestCase から派生している場合は、startMeasuring メソッドおよび stopMeasuring メソッドまたは keepMeasuring メソッドを複数回使用してパフォーマンス テスト測定の範囲を定義できます。テスト メソッドに startMeasuring、stopMeasuring および keepMeasuring への呼び出しが複数ある場合、パフォーマンス テスト フレームワークは測定値を累積して合計します。パフォーマンス テスト フレームワークは入れ子にされた測定範囲をサポートしていません。これらのメソッドを Test メソッド内で誤って使用し、TimeExperiment としてテストを実行すると、フレームワークは測定値を無効としてマークします。これらのパフォーマンス テストはユニット テストとして実行することもできます。詳細については、クラスを使用したパフォーマンスのテストを参照してください。
パフォーマンス テストの実行
パフォーマンス テストを実行する方法は 2 通りあります。
関数
runperfを使用してテストを実行します。この関数は、可変の測定数を使用して、信頼度 0.95 内における相対許容誤差 0.05 のサンプル平均を達成します。テストを 5 回実行してコードをウォームアップし、次に 4 ~ 256 回実行して統計目標値を満たす測定値を収集します。関数
testsuiteまたはTestSuiteクラス内のメソッドを使用して、明示的なテスト スイートを生成してから、時間実験を作成して実行します。TimeExperimentクラスのwithFixedSampleSizeメソッドを使用して、固定数の測定での時間実験を作成します。ウォームアップ測定の固定数とサンプルの固定数を指定できます。TimeExperimentクラスのlimitingSamplingErrorメソッドを使用して、許容誤差、信頼度などの統計目標値が指定された時間実験を作成します。また、ウォームアップ測定の数およびサンプルの最小数と最大数を指定できます。
回帰テストとしてパフォーマンス テストを実行できます。詳細については、クラスを使用したパフォーマンスのテストを参照してください。
無効なテスト結果について
場合によっては、テスト結果の MeasurementResult が無効としてマークされます。パフォーマンス テスト フレームワークによって MeasurementResult の Valid プロパティが false に設定されるとテスト結果は無効としてマークされます。この無効化は、テストに失敗した場合か、テストがフィルター処理された場合に発生します。また、テストで、matlab.perftest.TestCase の startMeasuring メソッドと stopMeasuring メソッドが正しく使用されないと、そのテストの MeasurementResult は無効としてマークされます。
パフォーマンス テスト フレームワークは、無効なテスト結果を検出すると、時間実験のタイプに応じて異なる動作をします。
頻度論的時間実験を作成した場合、フレームワークはそのテストの測定を停止し、次のテストに移ります。
固定回数時間実験を作成した場合、フレームワークは指定された数のサンプルの収集を継続します。
参考
runperf | testsuite | matlab.perftest.TimeExperiment | matlab.perftest.TimeResult | matlab.unittest.measurement.MeasurementResult