ウォームアップと反復
定常状態の性能を測定します。
「ウォームアップと反復」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
ウォームアップと反復
JMH は定常状態のパフォーマンス、つまり JVM がコードを完全に最適化した後に到達する速度を測定します。そのため、まず結果を使い捨てるウォームアップ反復を実行し、その後に実際の測定反復を実行します。このレッスンでは、その両方の調整方法を説明します。
ウォームアップする理由
初期の呼び出しはインタープリタで実行されるため低速ですが、JIT がホットメソッドをコンパイルすると、呼び出しは大幅に高速になります。遅い起動時の処理を測定値に含めると、数値が大きくなってしまいます。ウォームアップ反復ではコードを実行しますが、その計測時間は破棄されます。
@Warmup
@Warmup は、結果を使い捨てる段階を制御します。具体的には、反復回数と各反復の実行時間を指定します。
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
public class Bench {
@Benchmark
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
public int work() {
return 7 * 6;
}
}@Measurement
@Measurement は、実際に記録する段階を制御します。反復回数を増やすと信頼区間は狭くなりますが、実行時間は長くなります。
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
public class Bench {
@Benchmark
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
public int work() {
return 7 * 6;
}
}反復と処理回数
用語に注意してください。反復は時間を計測するウィンドウです(例: 1 秒間)。各ウィンドウ内で、JMH は可能な限り多くベンチマークメソッドを呼び出します。各呼び出しが処理です。スコアは 1 処理あたりで報告されます。
ウォームアップは何回必要か
反復ごとの出力を確認してください。連続するウォームアップ反復で値が変化しなくなれば、JIT は安定しています。最初の数回の測定反復でまだ値が変動する場合は、ウォームアップを増やしてください。ウォームアップ 5 回、測定 10 回から始めるのが一般的です。
フォークでウォームアップを追加する
各フォークはまったく新しい JVM なので、完全なウォームアップを毎回繰り返します。複数のフォークを実行すると、JIT プロファイルを分離できるだけでなく、JVM 間の分散も確認できます。これは安定性を最も正直に測定する方法です。
import org.openjdk.jmh.annotations.*;
@Fork(3)
@Warmup(iterations = 5)
@Measurement(iterations = 10)
public class Bench {
@Benchmark
public double sqrt() {
return Math.sqrt(2.0);
}
}効果を確認する
この単純な Java ループは、バッチごとの計測時間を出力します。JIT がメソッドをコンパイルするにつれて、後のバッチよりも最初のバッチの実行が遅くなることがよくあります。これは、ウォームアップによって破棄されるまさにその効果です。
public class Main {
static long busy(int n) {
long s = 0;
for (int i = 0; i < n; i++) s += (long) Math.sqrt(i);
return s;
}
public static void main(String[] args) {
for (int batch = 0; batch < 5; batch++) {
long t = System.nanoTime();
long r = busy(2_000_000);
System.out.println("batch " + batch + ": "
+ (System.nanoTime() - t) / 1000 + " us, r=" + r);
}
}
}時間ベースと回数ベース
デフォルトでは、反復は時間ベースです(N 秒間実行します)。batchSize とシングルショットモードを使って、固定の処理回数に切り替えることもできます。ただし、時間ベースの方式はマシンの速度に適応するため、一般的に使われます。
過度な調整を避ける
定常状態に達した後は、実行時間を非常に長くしても精度はあまり向上せず、時間だけがかかります。反復回数を最大化するのではなく、フォーク間で安定して再現可能な数値を目指してください。1 つだけ印象的な数値を得るより、再現性の方が重要です。
安定化の読み取り方
JMH は実行中に各反復のスコアを出力します。健全なベンチマークでは、ウォームアップ反復が収束し、測定反復が最終スコアの周辺に密集し、+/- の誤差が小さくなります。
クイックチェック
ウォームアップと反復についての理解度を確認しましょう。
まとめ
定常状態のパフォーマンスを測定する方法を学びました。
- @Warmup は、JIT がコンパイルできるように、破棄される反復を実行します。
- @Measurement は記録対象の反復を実行します。回数を増やすと誤差範囲が狭くなります。
- 反復は時間を計測するウィンドウであり、その中の各呼び出しが処理です。
- 複数の@Fork は新しい JVM でウォームアップを繰り返し、JVM 間の分散を明らかにします。
- 実行時間を最大化するのではなく、再現可能で安定したスコアを目指します。
よくある質問
「ウォームアップと反復」レッスンは無料ですか?
はい。「ウォームアップと反復」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「ウォームアップと反復」で何を学びますか?
定常状態の性能を測定します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ウォームアップと反復」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JMH を使う理由
- ベンチマークの記述
- ウォームアップと反復
- デッドコード削除の回避