Java Academy · Pelajaran

Mengapa JMH

Elakkan kesilapan penanda aras naif

Pelajaran 1 daripada 413 langkah

Mengapa JMH ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Mengapa JMH

Rangka Kerja Penanda Aras Mikro Java (JMH) ialah alat piawai untuk mengukur prestasi bahagian kecil kod Java. Gelung pemasaan buatan sendiri hampir selalu menghasilkan nombor yang salah kerana JVM ialah persekitaran masa jalan yang canggih dan mengoptimumkan kod.

JMH diwujudkan untuk meneutralkan perangkap tersebut.

Penanda Aras Naif

Percubaan pertama yang biasa dilakukan ialah membungkus gelung dalam System.nanoTime(). Cara ini kelihatan munasabah tetapi mempunyai kecacatan besar untuk penanda aras 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 bermula dalam mod tafsiran dan hanya menyusun kaedah panas kepada kod natif selepas ribuan pemanggilan. Penanda aras naif mengukur fasa tafsiran yang perlahan bercampur dengan fasa tersusun yang pantas, lalu menghasilkan purata yang tidak bermakna.

JMH menyelesaikan masalah ini dengan fasa pemanasan khusus yang dibuang.

Masalah 2: Penghapusan Kod Mati

Jika hasil pengiraan tidak pernah digunakan, JIT mungkin memadamkan pengiraan itu sepenuhnya. Penanda aras Anda kemudiannya mengukur gelung kosong.

JMH menyediakan penggunaan nilai pulangan dan Blackhole untuk menghalang perkara ini.

Masalah 3: Pelipatan Pemalar

Jika masukan ialah pemalar masa kompilasi, JIT mengira jawapan sekali lalu menggunakannya semula. Dalam contoh di bawah, pengkompil boleh menggantikan keseluruhan gelung dengan satu pemalar.

JMH menggunakan objek @State supaya masukan tidak terdedah kepada pengoptimum.

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: Pengoptimuman Gelung

JIT mengembangkan gelung, mengangkat kod invarian dan memvektorkan operasi. Gelung yang ditulis sendiri mengukur pengoptimuman ini dan bukannya operasi yang Anda ingin uji.

JMH menggantikan gelung Anda dengan bilangan lelaran yang dikawal dengan teliti dan diurusnya sendiri.

Masalah 5: Penggantian pada Tindanan

Gelung yang berjalan lama dalam main boleh disusun semasa pelaksanaan (penggantian pada tindanan), lalu menghasilkan ciri prestasi yang berbeza daripada kaedah yang disusun secara biasa. Hal ini memesongkan hasil secara tidak menentu.

Perkara yang Disediakan oleh JMH

  • Lelaran pemanasan yang berasingan dan dibuang.
  • Berbilang lelaran pengukuran dengan statistik.
  • Menjalankan dalam JVM baharu bagi mengelakkan pencemaran profil.
  • Blackhole dan penggunaan hasil untuk menghalang penghapusan kod mati.
  • Objek @State untuk menghalang pelipatan pemalar.

Cara Menjalankannya

JMH ialah kebergantungan berasingan (org.openjdk.jmh) dan biasanya dilancarkan oleh pemproses anotasi bersama proses build Maven/Gradle yang menghasilkan JAR boleh laksana. Anda tidak menjalankan penanda aras daripada main biasa seperti kod biasa.

Statistik Penting

JMH melaporkan bukan sahaja purata, tetapi juga ralat / selang keyakinan merentas lelaran dan proses. Hasil 42.0 +/- 1.3 ns/op memberitahu Anda nilai pusat dan sejauh mana nilainya berubah — perkara penting untuk mempercayai sesuatu pengukuran.

Bila Perlu Menggunakan JMH

Gunakan JMH apabila membandingkan dua pelaksanaan bagi laluan panas, mengesahkan pengoptimuman atau mengukur operasi berskala nanosaat hingga mikrosaat. Untuk kerja kasar berskala saat seperti I/O dan rangkaian, pemasaan jam dinding biasanya memadai.

Semakan Pantas

Uji pemahaman Anda tentang sebab JMH diperlukan.

Imbas Kembali

Anda telah belajar sebab penanda aras mikro memerlukan rangka kerja:

  • JVM menjalani pemanasan: kod yang ditafsir hanya menjadi kod tersusun selepas banyak panggilan.
  • Penghapusan kod mati dan pelipatan pemalar boleh memadamkan atau mengira terlebih dahulu kerja Anda.
  • Pengoptimuman gelung dan penggantian pada tindanan memesongkan gelung yang ditulis sendiri.
  • JMH menambah pemanasan, lelaran pengukuran, proses berasingan, Blackhole dan statistik.
  • Gunakannya apabila mengukur laluan panas berskala nanosaat.
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Mengapa JMH” percuma?

Ya — teks penuh “Mengapa JMH” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengapa JMH”?

Elakkan kesilapan penanda aras naif Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mengapa JMH” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengapa JMH
  2. Menulis Penanda Aras
  3. Pemanasan dan Lelaran
  4. Mengelakkan Penghapusan Kod Mati
← Kembali ke Java Academy