Mengapa JMH
Hindari kesalahan benchmark yang naif.
Mengapa JMH adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Mengapa JMH
Kerangka Kerja Tolok Ukur Mikro Java (JMH) adalah alat standar untuk mengukur kinerja potongan kecil kode Java. Perulangan pengukuran waktu buatan sendiri hampir selalu menghasilkan angka yang keliru karena JVM merupakan lingkungan eksekusi pengoptimalan yang canggih.
JMH dibuat untuk menetralkan jebakan tersebut.
Tolok Ukur Naif
Upaya pertama yang umum adalah membungkus perulangan dalam System.nanoTime(). Cara ini tampak masuk akal, tetapi sangat bermasalah untuk tolok ukur mikro.
public class Main {
static int compute(int n) { return n * n + 7; }
public static void main(String[] args) {
long start = System.nanoTime();
int sink = 0;
for (int i = 0; i < 1_000_000; i++) sink = compute(i);
long elapsed = System.nanoTime() - start;
System.out.println("ns: " + elapsed + " sink=" + sink);
}
}Masalah 1: Pemanasan JIT
JVM dimulai dalam mode interpretasi dan hanya mengompilasi metode yang sering dipanggil menjadi kode mesin setelah ribuan pemanggilan. Tolok ukur naif mengukur fase interpretasi yang lambat bercampur dengan fase terkompilasi yang cepat, sehingga menghasilkan rata-rata yang tidak bermakna.
JMH mengatasi hal ini dengan fase pemanasan khusus yang hasilnya dibuang.
Masalah 2: Penghapusan Kode Mati
Jika hasil perhitungan tidak pernah digunakan, JIT dapat menghapus seluruh perhitungan tersebut. Tolok ukur Anda kemudian hanya mengukur perulangan kosong.
JMH menyediakan penggunaan nilai kembalian dan Blackhole untuk mencegahnya.
Masalah 3: Pelipatan Konstanta
Jika masukan merupakan konstanta waktu kompilasi, JIT menghitung jawabannya sekali lalu menggunakannya kembali. Di bawah ini, kompiler dapat mengganti seluruh perulangan dengan satu konstanta.
JMH menggunakan objek @State agar masukan tidak terlihat oleh pengoptimal.
public class Main {
public static void main(String[] args) {
// 2 * 21 is constant; the JIT folds it to 42
int result = 2 * 21;
System.out.println(result);
}
}Masalah 4: Pengoptimalan Perulangan
JIT membuka gulungan perulangan, memindahkan kode invarian ke luar perulangan, dan memvektorisasi operasi. Perulangan yang ditulis sendiri mengukur pengoptimalan tersebut, bukan operasi yang sebenarnya ingin Anda uji.
JMH mengganti perulangan Anda dengan jumlah iterasi yang dikendalikan secara cermat dan dikelolanya sendiri.
Masalah 5: Penggantian pada Tumpukan
Perulangan yang berjalan lama di dalam main dapat dikompilasi di tengah eksekusi (penggantian pada tumpukan), sehingga menghasilkan karakteristik kinerja yang berbeda dari metode yang dikompilasi secara normal. Hal ini menyebabkan hasil menyimpang secara tidak terduga.
Yang Disediakan JMH
- Iterasi pemanasan terpisah yang hasilnya dibuang.
- Beberapa iterasi pengukuran disertai statistik.
- Percabangan ke JVM baru untuk menghindari pencemaran profil.
- Lubang hitam dan penggunaan hasil untuk mencegah penghapusan kode mati.
- Objek @State untuk mencegah pelipatan konstanta.
Cara Menjalankannya
JMH adalah dependensi terpisah (org.openjdk.jmh) dan biasanya diluncurkan oleh pemroses anotasi serta build Maven/Gradle yang menghasilkan JAR yang dapat dieksekusi. Anda tidak menjalankan tolok ukur dari main biasa seperti kode biasa.
Statistik Itu Penting
JMH melaporkan bukan hanya rata-rata, tetapi juga galat / interval kepercayaan di antara iterasi dan percabangan. Hasil 42.0 +/- 1.3 ns/op memberi tahu Anda nilai pusat sekaligus seberapa besar variasinya — hal yang penting untuk mempercayai suatu pengukuran.
Kapan Menggunakan JMH
Gunakan JMH saat membandingkan dua implementasi jalur panas, memvalidasi pengoptimalan, atau mengukur operasi berskala nanodetik hingga mikrodetik. Untuk pekerjaan kasar berskala detik (I/O, jaringan), pengukuran waktu jam dinding biasanya sudah memadai.
Pemeriksaan Singkat
Uji pemahaman Anda tentang alasan JMH diperlukan.
Ringkasan
Anda telah mempelajari alasan tolok ukur mikro memerlukan kerangka kerja:
- JVM mengalami pemanasan: kode yang diinterpretasikan baru menjadi kode terkompilasi setelah banyak pemanggilan.
- Penghapusan kode mati dan pelipatan konstanta dapat menghapus atau menghitung lebih awal pekerjaan Anda.
- Pengoptimalan perulangan dan penggantian pada tumpukan mengubah hasil perulangan yang ditulis sendiri.
- JMH menambahkan pemanasan, iterasi pengukuran, percabangan, lubang hitam, dan statistik.
- Gunakan JMH saat mengukur jalur panas berskala nanodetik.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengapa JMH” gratis?
Ya — teks lengkap “Mengapa JMH” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengapa JMH”?
Hindari kesalahan benchmark yang naif. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Mengapa JMH” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.