問題タブ [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.
java - 「-server」オプションを指定して JMH ベンチマークを実行する必要がありますか?
OpenJDK マイクロベンチマーク ツールであるJMHを使用しています。ビルド プロセスは、 jar 名と JMH 引数を渡しmicrobenchmarks.jar
て呼び出したものを作成します。java -jar
オプションを指定してベンチマークを実行する必要があるのは-server
なぜですか?
つまり、ベンチマークを次のように実行する必要があります。
java - JMH がベンチマークにクラスを選択しない
JMH が自分のクラスをベンチマークに取得しないというエラーが発生しました。
EventRunner が含まれる場所:
そして、私はこのエラーを受け取ります:
除外: org.sample.MyBenchmark.testMethod、一致しない com.stecurra.benchmark.strategy.EventRunner 一致するベンチマークはありません。正規表現のスペルミス?詳細出力には -v を使用します。
正規表現を有効にするにはどうすればよいですか?
ありがとう
java - コンストラクターでJavaコレクションのサイズを設定する方が良いですか?
その時点でサイズがわかっている場合は、コンストラクターCollection
にサイズを渡す方が良いですか? 拡張と割り当て/再割り当てCollection
に関する節約効果は顕著ですか?Collection
Collection
の最小サイズがわかっているが、上限がわからない場合はどうなりますか。少なくとも最小限のサイズで作成する価値はありますか?
java - Eclipse でメインから JMH を実行すると「一致するベンチマークがありません」
JMH の新機能を Eclipse で Java アプリケーションとして実行して試してみたかったのです。jmh-samples プロジェクトをインポートしてビルドしました。コンパイルされたクラスは /jmh-samples/target/generated-sources/annotations で終了し、/target/ にはいくつかの JAR があり、コマンド ラインから microbenchmarks.jar を実行すると通常どおり動作します。
ただし、メインを実行すると、常に取得されます
何か案は?バージョン0.3を使用しています
java - ヒープの場所への参照を書き込むことによるパフォーマンスの大幅な低下を説明できるものは何ですか?
世代別ガベージ コレクターがアプリケーションのパフォーマンスに及ぼす微妙な影響を調査しているときに、書き込まれた値がプリミティブか参照かに関して、非常に基本的な操作 (ヒープの場所への単純な書き込み) のパフォーマンスに驚くべき矛盾があることに気付きました。
マイクロベンチマーク
結果
ループ全体がほぼ 8 倍遅いため、書き込み自体はおそらく 10 倍以上遅くなります。何がこのような減速を説明できるのでしょうか?
プリミティブ配列の書き込み速度は、1 ナノ秒あたり 10 回を超えます。おそらく、私は自分の質問の反対側を尋ねるべきです:何が原始的な書き込みをそんなに速くするのですか? (ところで、私がチェックしたところ、時間は配列サイズに比例してスケーリングします。)
これはすべてシングルスレッドであることに注意してください。指定する@Threads(2)
と両方の測定値が増加しますが、比率は似ています。
ちょっとした背景:カード テーブルと関連する書き込みバリア
Young 世代のオブジェクトは、Old 世代のオブジェクトからのみ到達可能である可能性があります。ライブ オブジェクトの収集を避けるために、YG コレクターは、最後の YG コレクション以降に旧世代領域に書き込まれたすべての参照を認識している必要があります。これは、カード テーブルと呼ばれる一種の「ダーティ フラグ テーブル」で実現されます。このテーブルには、512 バイトのヒープのブロックごとに 1 つのフラグがあります。
スキームの「醜い」部分は、参照のすべての書き込みにカードテーブル不変条件が付随しなければならないことに気付いたときに発生します-コードの一部を維持します: 書き込まれるアドレスを保護するカードテーブル内の場所をマークする必要があります汚れています。このコードは書き込みバリアと呼ばれます。
特定のマシンコードでは、これは次のようになります。
書き込まれた値がプリミティブである場合、同じ高レベルの操作に必要なのはこれだけです。
書き込みバリアは、「ちょうど」もう 1 つの書き込みに寄与しているように見えますが、私の測定では、1 桁の速度低下を引き起こすことが示されています。これは説明できません。
UseCondCardMark
悪化させるだけ
エントリがすでにダーティとマークされている場合、カード テーブルへの書き込みを回避するはずの、非常にわかりにくい JVM フラグがあります。これは主に、多くのカード テーブルへの書き込みによってCPU キャッシュを介したスレッド間での誤った共有が発生する、いくつかの縮退したケースで重要です。とにかく、私はそのフラグをオンにしてみました:
java - JMH が何もしない場合、JMH は何をしますか?
これは私の最初の JMH ベンチマークです。やり方が悪いのかもしれませんが……。
私のベンチマークは次のようになります
私はそれを開始しました...そして待って待ってから殺しました。に問題があるの@Setup
ではないかと思い、簡略化しましたが、何も変わりませんでした。実行はかなり楽観的に始まります...
そして何も起こりません。久しぶりに続き、20行くらい書いて
と5行のような
次に、いくつかの結果を出力します
推定されたイータを修正します。
私は私@Setup
よりもはるかに頻繁に呼び出されますか、それとも遅い理由は他にありますか?