質問

ストップウォッチベンチマークを使用する人はいますか、またはパフォーマンスツールを常に使用する必要がありますか? Java用の優れた無料ツールはありますか?どのツールを使用しますか?

懸念を明確にするために、ストップウォッチのベンチマークは、オペレーティングシステムのスケジューリングによるエラーの影響を受けます。プログラムの所定の実行で、OSはタイミングを計っている機能の途中で別のプロセス(または複数)をスケジュールする場合があります。 Javaでは、JVMスケジューラーがミックスにさらにランダム性を追加するため、スレッド化されたアプリケーションの時間を計ろうとすると事態はさらに悪化します。

ベンチマーク時にオペレーティングシステムのスケジューリングにどのように対処しますか?

役に立ちましたか?

解決

ストップウォッチのベンチマークは、十分の反復を意味のあるものとして測定すれば問題ありません。通常、1桁の秒数の合計経過時間が必要です。そうしないと、スケジューリングやプロセスへのその他のO / S割り込みにより、結果が簡単に大きく歪んでしまいます。

このために、 System.currentTimeMillis()に基づいた、かなり前に作成した静的メソッドの小さなセットを使用します。

プロファイリング作業のために、 jProfiler を使用しました何年もの間、非常に良いことがわかりました。最近、 YourKit に目を通しました。これはWebサイトからは素晴らしいようですが、まったく使用していません。 、個人的に。

スケジューリングの中断に関する質問に答えるために、一貫性が達成/観察されるまで繰り返し実行することは、実際にはプロセススケジューリングから異常な結果を取り除くために機能することを発見しました。また、スレッドスケジューリングは、5〜30秒の実行に対して実際的な影響を与えないこともわかりました。最後に、私の経験では、数秒のしきい値を超えると、スケジューリングは結果にほとんど影響を与えません。5秒の実行は、時間/反復の5分の実行と一貫して平均的になることがわかりました。

「ウォームアップ」するために、テストされたコードを約10,000回実行することを検討することもできます。 JIT。テストされたコードが実際に時間の経過とともに実行されると予想される回数に応じて。

他のヒント

十分に長い時間間隔を測定する限り、完全に有効です。合計経過時間が1秒を超えるように、テストするものを20〜30回実行します。 System.currentTimeMillis()に基づく時間計算は0msまたは〜30msの傾向があることに気付きました。それ以上正確なものを手に入れることはできないと思います。短い時間間隔を実際に測定する必要がある場合は、System.nanoTime()を試してください。

プロファイラーはより詳細な情報を提供し、パフォーマンスの問題の診断と修正に役立ちます。

実際の測定では、ストップウォッチ時間はユーザーが気づくものですので、物事が許容範囲内であることを検証したい場合、ストップウォッチ時間は問題ありません。

ただし、実際に問題を修正する場合は、プロファイラーが非常に役立ちます。

ストップウォッチは実際には最高のベンチマークです!

実際のエンドツーエンドのユーザー応答時間は、実際に重要な時間です。

利用可能なツールを使用してこの時間を取得することは常に可能とは限りません。たとえば、ほとんどのテストツールには、ブラウザがページをレンダリングするのにかかる時間は含まれないため、CSSが不適切に書かれた過度に複雑なページには1秒未満の応答時間が表示されますテストツールには、しかし、5秒とユーザーへの応答時間を加えます。

これらのツールは、自動化されたテストや問題判別には最適ですが、実際に測定したいものを見失うことはありません。

タイミングのテスト方法に応じて異なる答えが得られるため、現実的な数の反復をテストする必要があります。操作を1回しか実行しない場合、多くの反復の平均を取ると誤解を招く可能性があります。 JVMのウォームアップ後の所要時間を知りたい場合は、タイミングに含まれていない多数(たとえば10,000)の反復を実行できます。

より正確な System.nanoTime()を使用することもお勧めします。テスト時間が約10マイクロ秒以下であれば、これを頻繁に呼び出したくないか、結果が変わる可能性があります。 (たとえば、5秒間テストしていて、これがいつ稼働するかを知りたい場合、反復が非常に速いことがわかっている場合、1000回の反復ごとにnanoTimeのみを取得します)

  

ベンチマーク時にオペレーティングシステムのスケジューリングにどのように対処しますか?

使用するマシンを代表するシステム上の十分な長さのベンチマーク。 OSがアプリケーションの速度を低下させる場合、それは結果の一部であるはずです。

OSがなければ、私のプログラムは高速になると言っても意味がありません。

Linux を使用している場合、 numactl chrt taskset などのツールを使用して制御できますCPUの使用方法とスケジューリング。

プロファイラーはタイミングを邪魔する可能性があるため、ストップウォッチタイミングの組み合わせを使用して全体的なパフォーマンスの問題を特定し、プロファイラーを使用して時間を費やしている場所を特定します。必要に応じてプロセスを繰り返します。

結局のところ、「ノーウォッチベンチマーク」の直後に、おそらく2番目に人気のあるベンチマークの形式です。 -「このアクティビティは遅いように見えますが、それは速いようです」

通常、最適化するために最も重要なのは、ユーザーエクスペリエンスを妨げるものです。これは、ほとんどの場合、アクションを実行する頻度と、同時に実行されるその他の機能です。多くの場合、他の形式のベンチマークはこれらをゼロにするのに役立ちます。

重要な問題は、操作の複雑さと時間の長さだと思います。

時々、物理的なストップウォッチ測定を使用して、計算に数分、数時間、数日、さらには数週間かかるかどうかを確認します(私は、数秒のオーダーの実行時間が、たとえ数秒でも、分は最も一般的な期間です)。

ただし、リンクされた記事で言及されているjava millis呼び出しのように、コンピューター上のあらゆる種類のクロックシステムへの呼び出しによって提供される自動化は、何かが実行される時間を手動で確認するよりも明らかに優れています。

プロファイラーはうまく機能しますが、アプリケーションへの適用に問題があります。通常、動的コード生成、DLLの動的ロード、および2つの組み込みジャストインタイムコンパイルで実行される作業が含まれます。アプリケーションのスクリプト言語。それらは、単一のソース言語と、複雑なソフトウェアに対する他の非現実的な期待を想定することに限られていることがよくあります。

今日、たくさんのdBaseファイルを検索して情報を収集するプログラムを実行しました。実行するのに 1時間かかりました。私はコードを見て、ボトルネックが何であるかを知識に基づいて推測し、アルゴリズムを少し改善し、プログラムを再実行しました。今回は 2.5分で完了しました。

新しいバージョンが大幅に改善されたことを伝えるために、派手なプロファイリングツールやベンチマークスイートは必要ありませんでした。実行時間をさらに最適化する必要がある場合は、おそらくより高度な分析を行っていたはずですが、これは必要ありませんでした。この種の「ストップウォッチベンチマーク」は、多くの場合に許容できるソリューションであり、これらのケースでは、より高度なツールを使用すると実際に時間がかかります。

ストップウォッチのベンチマークがあまりにも恐ろしいとは思いませんが、SolarisまたはOS Xマシンにアクセスできる場合は、DTraceをチェックアウトする必要があります。私はこれを使用して、アプリケーションのタイミングに関する素晴らしい情報を取得しました。

非常に簡単なので、ストップウォッチベンチマークを常に使用します。しかし、結果は私にとって非常に正確である必要はありません。正確な結果が必要な場合は、ストップウォッチベンチマークを使用しないでください。

私はいつもやる。私はむしろプロファイラーを使用したいのですが、私が使用しているドメイン固有言語のベンダーはプロファイラーを提供していません。

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