問題タブ [jmh]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
802 参照

java - JMH のフォーク間で異なるベンチマーク結果

要するに、私の質問は、なぜ JMH ベンチマークの結果がフォーク内で安定しているのに、フォーク間で大きく異なるのかということです。

私はこれを多くのベンチマークで観察しました (通常はデータセットの処理を伴います)。簡単な例を次に示します。

1 秒のウォームアップを 5 回繰り返し、1 秒の測定を 15 回繰り返します。で指定されているように、手順全体が (JVM の再起動と共に) 50 回繰り返されます@Fork(50)。通常のフォークは次のようになります。

ご覧のとおり、反復ごとの結果は非常に安定しており、標準偏差は低くなっています。ただし、時々 (おそらく数十回に 1 回)、次のようなフォークが表示されます。

結果も非常に安定していますが、通常のフォークよりも 2 倍以上遅くなります。

フォークごとの要約は次のとおりです (フォーク番号、平均時間、平均時間でソートされたマイクロ秒単位の標準偏差):

ご覧のとおり、ほとんどの反復で、平均値は interval に分類され5.142..5.174 us、次に interval に小さなジャンプが5.210..5.249 usあり、次に に大きなジャンプが5.625..5.858 usあり、次に 2 つの外れ値があります。生の結果は、このgistで入手できます。

では、これらのジャンプと外れ値とは何ですか? ベンチマーク手順の不具合ですか、それともそのような影響が本番環境でも発生し、まれに私のプログラムが 2.5 倍遅くなることがありますか? これはハードウェアまたは JVM 関連の問題ですか? 実行の開始時に、自分が高速フォークか低速フォークかを予測できますか?

測定は、Oracle JDK 1.8.0_45 および JMH 1.10.3 を使用して、Windows 7 64 ビット Intel i5 QuadCore システムで実行されました。

0 投票する
1 に答える
904 参照

java - JMH と Mode.AverageTime を使用した OutOfMemory

+演算子とStringBuilderを使用して文字列連結を比較するためのマイクロベンチマークを作成しています。この目的のために、 batchSizeパラメータを使用する OpenJDK の例に基づいて JMH ベンチマーク クラスを作成しました。

ベンチマークを実行すると、stringBuilderConcatenationメソッドに対して次のエラーが発生します。

デフォルトの JVM ヒープ サイズを増やす必要があると考えていたので、JMH が提供するオプション-Xmx10Gで値を使用して最大 10GB まで許可しようとしました。-jvmArgs残念ながら、まだエラーが発生します。

batchSizeその結果、パラメーターの値を1に減らそうとしましたが、それでもOutOfMemoryErrorが発生します。

私が見つけた唯一の回避策は、ベンチマーク モードを に設定することMode.SingleShotTimeです。このモードではバッチを 1 回のショットと見なしているように見えるため (単位列にs/opが表示されていても)、必要なメトリック、つまり一連のバッチ操作を実行する平均時間を取得しているようです。ただし、なぜそれが動作しないのかはまだわかりませんMode.AverageTime

stringConcatenationメソッドのベンチマークは、どのベンチマーク モードを使用しても期待どおりに機能することにも注意してください。stringBuilderConcatenationこの問題は、StringBuilder を使用するメソッドでのみ発生します。

ベンチマーク モードを に設定した場合に前の例が機能しない理由を理解するための助けをMode.AverageTime歓迎します。

私が使用した JMH のバージョンは1.10.4です。

0 投票する
1 に答える
180 参照

java - JMH、コードのマイクロベンチマーク部分

マイクロベンチマークから呼び出されたすべてのメソッドのうち、特定の 1 つのメソッドのみを測定するようにJMHに指示する方法があるかどうかを確認したいと思います。

単体テストをベースとして使用してマイクロベンチマークの作成を自動化したいので、手動でマイクロベンチマークを作成する必要はありません。私の研究では、パフォーマンスに影響を与えることを期待して、いくつかの自動変更を行う大規模なコードベースがあります。これまでのところ、コード内で 1200 箇所が変更されています。変換を行い、変換の影響を自動的に測定するフレームワークを提供したいので、自動化が必要です。

ここでJMH:解決策が提供される内部メソッド時間を考慮しないでください。

0 投票する
1 に答える
2986 参照

java - JMHの操作数とは正確には何ですか?

@OperationsPerInvocationJava Microbenchmarking Harness (JMH)のアノテーションの JavaDoc には、次のように記載されています。

value public 抽象 int 値

Returns:1 回の Benchmark 呼び出しあたりの操作数。デフォルト: 1

JMH を初めて使用するので、ここでどのような操作 (バイト コード操作、アセンブリ コード操作、Java 操作など) を意味するのか疑問に思っています。

この質問は当然、「操作」という用語が使用される JMH (ドキュメント、出力、コメントなど) のすべての場所を指します (例: 「操作/時間」単位または「時間単位/操作」)。

0 投票する
1 に答える
1458 参照

java - JMH を使用した Spring MVC スループットのテスト

そのため、Spring MVC (主に REST コントローラーのみ) でコンテナーなしでベンチマークを実行しようとしています。Spring とそのリクエスト処理だけです。Jersey を使用すると、次のようなことができます。

ApplicationHandler、Jersey リクエスト処理へのメイン エントリ ポイントです。すべてのジャージー構成は にありJerseyConfigます。基本的には、リクエスト ( ContainerRequest) を作成するだけで、ハンドラーを呼び出してリクエストを渡すだけでリクエストを処理できます。リクエストがリクエスト処理サイクルを通過した後、レスポンスが返されます。

これと同じ機能を Spring MVC で模倣しようとしています。本当に、どうやってそれを行うのかさえわかりませんでした。くっつくことを期待して、壁に物を投げ始めました。DispatcherServlet私はちょっと(またはより正確には)でこれを行うことができるという考えを持っていましたFrameworkSevlet。しかし、それを行うために、私が見ることができる唯一の方法は、processRequestリフレクションを通じて保護されたものにアクセスできるようにすることでした. これが私の試みです

しかし、これは機能していません。この行でNPE を取得しています。これは、webApplicationContextが nullであることを意味すると推測しています。しかし、私はそれを上に設定しています。

NPEであろうとなかろうと、私はこれを正しい方法で行っているかどうかさえわかりません。ではなく、調べなければならない他のコンポーネントがある場合DispatcherServlet

誰でもこれを機能させる方法を知っていますか? 別のメソッドを呼び出して、別のコンポーネントを調べる必要がありますか? 上記の試行を実際に機能させるために欠落している可能性のある構成はありますか?

要件スタンド

  • JMHを使う
  • リクエストからレスポンスまでのSpring処理のみのスループットをテストします。

GitHub で完全な実行可能なプロジェクトを参照してください

0 投票する
1 に答える
676 参照

java - 一定長の System.arraycopy

私は JMH ( http://openjdk.java.net/projects/code-tools/jmh/ ) で遊んでいて、奇妙な結果に出くわしました。

配列の浅いコピーを作成する方法をベンチマークしており、期待される結果を観察できます (配列をループすることは悪い考えであり、との間#clone()に大きな違いはありません)。System#arraycopy()Arrays#copyOf()

ただしSystem#arraycopy()、配列の長さがハードコードされている場合は 1/4 遅くなります... 待って、何? これはどのように遅くなりますか?

何が原因である可能性があるのか​​ 、誰かが考えを持っていますか?

結果 (スループット):

そしてベンチマーククラス:

0 投票する
1 に答える
550 参照

java - JMH。マイクロベンチマークの結果を公開する

マイクロベンチマークでのデッド コードの排除を回避するための最も一般的な解決策は次のとおりです。

  1. 計算結果を返す
  2. ブラックホールを使用して結果を消費します。

私の質問は:

計算の結果をパブリック変数に入れることで、デッド コードの削除を回避することは可能でしょうか?

編集:

Shipilev の回答のおかげで、JMH の例で説明されているように、結果を返すか、ブラックホールを使用してそれらを消費することは、デッド コード消去 (DCE) を回避するために適切に行う必要があることに気付きました。

したがって、明確にするために質問を書き直します。

計算の結果を返すか、blackwholesで消費するだけで DCE を回避できる場合は、結果をパブリック変数に配置するだけで十分ですか?

次のように、サンプルJMHSample_08_DeadCodeのバリエーションを実行しました。

そして、結果からそう思われます:

0 投票する
1 に答える
1055 参照

java - Java ロックフリーのパフォーマンス JMH

JMH マルチスレッド テストがあります。

  1. 現在のバリアントでは、パフォーマンスが ~ 55 ops/us です
  2. ただし、「特別な行」のコメントを外すか、 unsafe.putOrderedObject に置き換えると (任意の方向 - current.next = oまたはo.next = current )、パフォーマンスは ~ 2 ops/us になります。

私が理解しているように、これは CPU キャッシュで発生するものであり、ストア バッファをクリーニングしている可能性があります。CAS を使用せずにロックベースの方法に置き換えると、パフォーマンスは 11 ~ 20 ops/us になります。
LinuxPerfAsmProfiler と PrintAssembly を使用しようとすると、2 番目のケースで次のようになります。

誰かが私に実際に何が起こっているのか説明できますか? なぜそんなに遅いのですか?ここでストアロードバリアはどこですか?putOrdered が機能しないのはなぜですか? そして、それを修正する方法は?