web-dev-qa-db-ja.com

Javaでシングルスレッドの複雑なアルゴリズムを測定するための最良のマクロベンチマークツール/フレームワークは何ですか?

Javaコード、シングルスレッド、ローカル、複雑なアルゴリズム)のパフォーマンス測定(主にランタイム)を実行したい(したがって、マクロベンチマークでJVM実装を測定したくない。)

ツールを使用して、

  • 複雑さを分析、つまり、コードがパラメーターn(検索深度)に対してどのようにスケーリングされるかを確認します。 (nでパラメーター化されたjunitテストがすでにあります。)
  • 傾向分析を実行して、コードベースの変更によってコードの速度が低下した場合に警告を表示します。

このために、私はツールまたはフレームワークを使用したいと思います

  • statisticsを実行し、平均値、標準偏差、信頼区間を最適に計算します。これは非常に重要です。
  • パラメータ化にすることができます(上記のパラメータnを参照)。これも非常に重要です。
  • 派手なプロットを作成できるのはいいですが、必須ではありません
  • 自動(junit-)テストで使用して、プログラムが遅くなった場合に警告することができますが、これも必須ではなく、プラスです。

どのようなツール/フレームワークがこれらの要件を満たしていますか?どれが複雑さと傾向分析に適していますか、そしてなぜですか?

54
DaveFar

以下は、私が見つけたすべてのツールのアルファベット順のリストです。言及されている側面は次のとおりです。

  • 簡単にパラメータ化できますか
  • Javaライブラリか、少なくともJavaプログラムに簡単に統合できる
  • jVMマイクロベンチマークを処理できますか。ウォームアップフェーズを使用する
  • 結果を視覚的にプロットできますか
  • 測定値を永続的に保存できますか
  • 新しいコミットがスローダウンを引き起こしたことを警告する傾向分析を行うことができますか
  • それは統計を提供して使用しますか(少なくとも最大、最小、平均、標準偏差)。

自動操縦

パラメータ化可能; Perlライブラリ; JVMマイクロベンチマークなし。プロット;持続;トレンド分析!?;適切な統計(結果が安定するまで特定のテストを実行し、外れ値を強調表示します)。

ベンチマークフレームワーク

パラメータ化できません。 Javaライブラリ; JVMマイクロベンチマーク;プロットなし;持続性なし;傾向分析なし;統計。

統計は非常にうまく機能します:平均、最大、最小、標準偏差に加えて、95%信頼区間(ブートストラップを介して)とシリアル相関(たとえば、プログラムが非決定的に動作する場合に発生する可能性がある発振実行時間について警告するため)も計算します。 HashSetを使用するためです)。正確な測定値を取得するためにプログラムを反復する必要がある頻度を決定し、レポートと警告(たとえば、外れ値とシリアル相関について)のためにこれらを解釈します。

また、マイクロベンチマークは非常にうまく機能します(詳細については、 javaを使用して迅速で信頼性の高いベンチマークを作成しますか? を参照してください)。

残念ながら、フレームワークは、他の多くのヘルパークラスと一緒にバンドルされたutilパッケージに含まれています。ベンチマーククラスは、JSci(Java用のScience API)とMersenne Twister( http://www.cs.gmu.edu/~sean/research/ )に依存しています。著者のBrent Boyerが時間を見つけた場合、ライブラリを煮詰め、より簡単なグラファーを追加して、ユーザーが測定値を視覚的に検査できるようにします。相関と外れ値。

キャリパー

パラメータ化可能; Javaライブラリ; JVMマイクロベンチマーク;プロット;持続;傾向分析なし;統計。

Androidアプリ向けに調整された比較的新しいプロジェクト。若く見えますが有望です。GoogleGuavaに依存します:(

一般的な監視

パラメータ化できません!?; Javaライブラリ; JVMマイクロベンチマークなし!?;プロット;サーブレットによる永続化;傾向分析なし!?;統計なし!?。

AOPインスツルメンテーションをサポートします。

JAMon

パラメータ化できません。 Javaライブラリ、JVMマイクロベンチマークなし、追加のツール(JarepまたはJMX)によるプロット、持続性、および傾向分析);統計。

Log4jと絡み合った適切な監視により、データにプログラムでアクセスまたはクエリを実行し、プログラムが結果に対してアクションを実行することもできます。

Java Simon

パラメータ化できません!?; Javaライブラリ; JVMマイクロベンチマークなし; Jarepでのみプロット; JMXでのみ持続;傾向分析なし;統計なし!?。

Jamonのライバルは、モニターの階層をサポートします。

[〜#〜] jetm [〜#〜]

パラメータ化できません。 Javaライブラリ; JVMマイクロベンチマーク;プロット;持続;傾向分析なし;統計なし。

素敵な軽量監視ツール、依存関係なし:)十分な統計(標準偏差なし)を提供せず、それに応じてプラグインを拡張することは非常に困難に見えます(アグリゲーターとアグリゲートには、最小、最大、平均の固定ゲッターしかありません)。

jmeter

パラメータ化可能!?; Javaライブラリ; JVMマイクロベンチマークなし!?;プロット;持続性;傾向分析!?;統計!?。

Webアプリケーションの負荷テストに合わせて調整された優れた監視ライブラリ。

Java Microbenchmark Harness(jmh

パラメータ化可能(Java API)によるカスタム呼び出し元); Javaライブラリ; JVMマイクロベンチマーク;プロットなし;持続性なし;トレンド分析なし;統計。

オラクルのHotSpotエキスパートによって構築されたベンチマークハーネスは、OpenJDKパフォーマンス作業で使用されるHotSpotでのマイクロベンチマークに非常に適しています。信頼できるベンチマーク環境を提供するために、極端な対策が講じられています。人間が読める出力に加えて、jmhは、結果を処理するためのJava APIなどを提供します(サードパーティのプロッタや永続化プロバイダなど)。

junit-Benchmarks

パラメータ化可能; Javaライブラリ; JVMマイクロベンチマーク;プロット;持続性(CONSOLE、XMLまたはデータベースH2を使用)、グラフィカルな傾向分析、統計(最大、最小、平均、標準偏差;ただし、さらに拡張するのは容易ではない)統計)。

Junit-4-ruleをjunitテストに追加するだけです:)

junit-Benchmarksはオープンソースであり、Apache 2ライセンスに基づいています。

Update:プロジェクトが jmh に移動しました

junitperf

主に、パフォーマンス(JUnitテストデコレータTimedTestを使用)およびスケーラビリティ(JUnitテストデコレータLoadTestを使用)の傾向分析を行うためのものです。

パラメータ化可能; Javaライブラリ、JVMマイクロベンチマークなし、プロットなし、持続性なし、統計なし。

perf4j

パラメータ化できません。 Javaライブラリ; JVMマイクロベンチマークなし;プロット; JMXによる永続化; log4jアペンダーによる傾向分析;統計。

ロギングフレームワーク上に構築され、AOPを使用できます。

Project Broadway

非常に一般的な概念:モニターは事前定義された条件を監視し、条件が満たされた場合の対応方法を指定します。

speedy-mcbenchmark

主な焦点はパラメータ化可能性です。アルゴリズムがスケーリングするかどうかを確認します。つまり、O(n)、O(n log(n))、O(n²)であるかどうかを確認します...

Javaライブラリ; JVMマイクロベンチマーク。プロットなし;持続;トレンド分析;統計なし。

グラインダー

パラメータ化可能; Jythonライブラリ。 JVMマイクロベンチマークなし。プロット;持続;傾向分析なし。良い統計はありませんが、簡単に拡張できます。

Jython、HTTPClient、JEditSyntax、ApacheXMLBeans、PicoContainerに依存します。

[〜#〜] tptp [〜#〜]

パラメータ化可能!?; Javaツールプラットフォーム; JVMマイクロベンチマークなし!?;プロット;持続性;グラフィカルトレンド分析;統計なし!?

Test&Performance Tools Platformは、(Eclipseと4つのEMFモデルに基づく)汎用で拡張可能な巨大なツールプラットフォームです。したがって、強力ですが非常に複雑で、Eclipseの速度を低下させ、あなた自身のニーズ(例えば、統計が反復の数に影響を与えるようなもの)は非常に難しいようです。

semon

パラメータ化可能!?; Javaライブラリ; JVMマイクロベンチマークなし;プロット;持続性;傾向分析!?;統計!?。

このツールは、大規模なクラスターでの監視に合わせて調整されています。

67
DaveFar

別の選択肢は、Googleの caliper です。 パラメータ化されたテスト を許可します。

9
sbridges

http://labs.carrotsearch.com/junit-benchmarks.html を使用してみてください。これはJUni4の拡張であり、機能は次のとおりです。

実行時間の平均と標準偏差を記録します。
ガベージコレクターのアクティビティの記録。
ベンチマークごとのJVMウォームアップフェーズ。
実行ごとの履歴グラフの生成。
H2 SQLデータベースでのオプションの結果の永続性(高度なクエリ、履歴分析)。

7
Ula Krukar