単体テストで相対的なパフォーマンスを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1100237

  •  11-09-2019
  •  | 
  •  

質問

デプロイメント時にコードがどのような種類のシステムで実行されるかわからない場合、システムの可能性を基準として使用するパフォーマンス ベンチマークを作成するにはどうすればよいでしょうか。

私が言いたいのは、システムがコードを 1 秒あたり 1000 回実行できる場合、それができるだけ 1000 回に近づくことをテストで確認したいということです。500 しか実行できない場合、それが比較したいレートです。

答えをより具体的にするのに役立つ場合は、JUnit4 を使用しています。

ありがとう。

役に立ちましたか?

解決

テストは、あなたが/パスを持っているしきい値を失敗を意味します。性能試験では、これは遅すぎることと、あなたは十分に速く、失敗するとあなたが合格します。あなたが失敗した場合は、再作業をやって起動ます。

あなたが失敗することはできません場合は、実際にテストしていない、ベンチマーキングしています。

あなたは「システムが実行することのできる」について話すとき、

あなたは「できる」を定義する必要があります。あなたは、ハードウェアの性能ベンチマークの多数のいずれかを使用することができます。など砥石、ドライストーンは、人気があります。または、おそらくあなたは、あなたがTPCベンチマークを見たいかもしれませんが、データベース集中型のアプリケーションを持っています。または、おそらくあなたはネットワーク集約型アプリケーションを持っているとのnetperfを使いたいです。またはGUIを多用するアプリケーションやグラフィックスベンチマークのいくつかの種類を使用します。

これらのいずれかがあなたの「機能」の測定のいくつかの種類を与えます。一つ以上を選択してください。彼らはすべての良いです。同様に議論の余地が。同様にあなたの競争相手に向かってあなたから離れてバイアスされます。

あなたはベンチマークを実行したら、あなたは、あなたのソフトウェアを実行し、システムが実際に何を見ることができます。

あなたは十分なデータを収集する場合 - -

あなたは可能性があり、いくつかのベンチマークの数字と、あなたのパフォーマンスの数値との間に何らかの相関関係を確立します。あなたがなど、ワークロード、ハードウェア構成、OSのバージョン、仮想マシン、DBサーバ、に基づいて変動のすべての種類が表示されます。

十分に異なる構成で十分ボックスから十分なデータを使用すると、最終的には「このハードウェア、ソフトウェア、チューニングパラメータと設定を考えると、私は私のソフトウェアは、毎秒[X]の取引を行うことを期待すると言うのパフォーマンスモデルを開発することができるようになります。」それは「可能」の固体の定義です。

あなたがそのモデルを持っていたら、

、あなたはその後、機能番号に対するあなたのソフトウェアを比較することができます。あなたは非常に完全なモデルを持ってまで、あなたは本当にコードの一部に毎秒1000回を実行しているのも、可能であるシステムを知りません。

他のヒント

私は理由のカップルのための性能試験のためのユニットテストを使用することはありません。

まず、ユニットテストは、周辺システム/コードに依存していてはなりません。パフォーマンステストは、ハードウェア/ OSに大きく依存するので、サーバーを構築し、双方の開発者のワークステーションで使用可能になり均一な措置を取得することは困難であるなど。

第二に、ユニットテストは本当に速い実行する必要があります。あなたは、パフォーマンス・テストを行うと、あなたは通常、非常に大規模なデータセットを持っていると注文平均数の倍のカップルは/オーバーヘッドなどを取り除く実行回数を繰り返します。これらはすべて、高速テストのアイデアに対して動作します。

同意する ブライアン 彼がそれを言うとき 単体テストはパフォーマンス テストを行う適切な方法ではありません. 。ただし、次の例として使用できる短い例をまとめました。 結合テスト さまざまなシステム構成/環境で実行できます。
これは、この点に関して何ができるかを示すだけのものであり、システムのパフォーマンスに関する公式声明を裏付けるほど正確な結果を提供するものではないことに注意してください。

import static org.junit.Assert.*;
import org.junit.Test;

package com.stackoverflow.samples.tests {

    @Test
    public void doStuffRuns500TimesPerSecond() {
        long maximumRunningTime = 1000;
        long currentRunningTime = 0;
        int iterations = 0;

        do {
            long startTime = System.getTimeMillis();

            // do stuff

            currentRunningTime += System.getTimeMillis() - startTime;
            iterations++;
        }
        while (currentRunningTime <= maximumRunningTime);

        assertEquals(500, iterations);
    }
}

私は計算する時間がかかりすぎた正しい答えは失敗であるリアルタイムシステムのために運命づけられているコードのテストにいくつかの時間の測定を行います。

私はすべてのテストは、最近のビルドを引き継いだことをデルタCPU時間プロットです。 、CPU時間ではない本当の時間に注意してください。実際の値はあまり重要ではありません - 重要なのは、それがどのように変化したかくらいです。

私は非常に私は簡単にそれを引き起こした特定のチェンジセットにズームインすることができ、テストのための実行時間を変更するアルゴリズムに変更をコミットした場合。必ずしも絶対値 - 私が本当に気にすることは興味のこれらのポイントです。そこに多くのトレードオフは、リアルタイムシステムではかなり頻繁にあり、単純な比較として、これらは常にテストフレームワークに表現することができません。

絶対時間を見てみると、最初にそれらを正規化し、合理的なようだが、現実には、あなたのシステムとターゲット・システム間の変換は非線形になる - など、ターゲットシステム上のインスタンスのキャッシュ圧力、スワップの使用量、ディスク速度のためには、発生することがありテストのための時間は、あなたのシステムのように異なるしきい値で爆発する。

あなたは絶対にこの点で正確であるテストが必要な場合は、ターゲット・システムを複製し、あなたがすることを期待するような試験奴隷としてではなく似た環境でそれを使用します。

私の場合、実際にはシリアルポートからの応答を読んだり、それがクラッシュしたので、何の応答を見ていない、リモートでpowercycling、DSPにファームウェアをダウンロードすることができる!

- jeffk ++

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top