2012-02-02 4 views
2

私はこの質問でJavaを使用しますが、これは現代のすべてのアプリケーション開発に実際に適用されます。環境全体の正確な計測性能テスト

  • デベロッパーサンドボックス
  • 継続的インテグレーション&/
  • QAをテストするハードウェアを
  • 生産

ステージング、利用可能:それらの多くのように私たちの "環境パイプライン" は、このようになります。 RAM &これらの環境のCPUは異なります。私のラップトップは2GBのデュアルコアWindowsマシンです。テストは4GBマシンで実行されます。プロダクションは、2つの(負荷分散された)8GBクアッドコアサーバです。

これらの異なるマシン(環境)で動作する場合、明らかに同じコードが異なる動作をします。

私は形式になり私のクラスのいくつかのために自動化されたパフォーマンステストを書くことについて考えていた

:テストを実行するために、たとえば、8秒以上かかる場合はこのように自動化されたパフォーマンステストが失敗した

private static final long MAX_TIME = 8000; 

@Test 
public final void perfTestSomething() { 
    long start = System.currentTimeInMillis(); 

    // Run the test 

    long end = System.currentTimeInMillis(); 

    assertTrue((end - start) < MAX_TIME); 
} 

しかし、この実現は私にもたらされました。コードは異なる環境で実行され、JVMとGCの状態によって異なる動作をします。私は自分のマシンで同じテストを1000回実行することができ、結果は大きく異なります。

私は質問します。&ゲージ自動パフォーマンステストを正確に定義するには、ある環境から次の環境へコードを昇格させる方法はありますか?

ありがとうございます!

答えて

1

より厳密に管理された特定の場所でのみパフォーマンステストを実行することができます。必ずしもすべての環境で実行する必要はありませんが、そこにはほとんど利点はありません。あなたは、プロダクション設定を最も模倣した環境でそれらを実行する必要があります(これはあなたが本当に心配していますよね?)。

また、パフォーマンスの制限については、妥当なオーバーヘッドを与えてください。あなたのサーバーが現在行うことのすぐ上にそれらをロックしないでください。いくつかの妥当なしきい値を選択して、現在の実行のばらつきを考慮します。

長期的に言えば、パフォーマンス数値のグラフです。ハードな制限ではありません。そうすれば、時間の経過とともにさまざまな機能のトレンドを見ることができ、トレンドが高すぎると攻撃することができます。

1

自分のマシンで同じテストを1000回実行することができ、結果が大きく異なる可能性があります。

実際、そうではありません。もちろん、いくつかのばらつきがありますが、マシンが他のタスクによって重い負荷を受けていない場合は、1000タイミングの大部分がかなり接近します。

意味のある安定した数字を得るための1つの方法は、テストを何度も実行してから、特定のタイミング(たとえば中央値、90パーセンタイル、99など)を特定することです。

テストの単位がJVMの1回の呼び出しよりも小さい場合(たとえば、単一のメソッドまたは関連するメソッドのグループをテストしているなど)、複雑な問題が発生します。その場合、私は強くお勧めします。 How do I write a correct micro-benchmark in Java?

+0

素晴らしいアドバイス - ありがとうございました。私はあなたの答えをアップしましたが、私の状況にもっと適している*ちょっとしたものだったので、緑色のチェックをrfreakに与えなければなりませんでした。しかし、無限にありがとうございます。 – IAmYourFaja

関連する問題