Java Academy · Pelajaran

Mengelakkan Penghapusan Kod Mati

Blackhole dan keadaan

Pelajaran 4 daripada 413 langkah

Mengelakkan Penghapusan Kod Mati ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 4 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.

Mengelakkan Penghapusan Kod Mati

Perangkap terbesar dalam penanda aras mikro ialah penghapusan kod mati (DCE): jika JIT membuktikan bahawa sesuatu hasil tidak pernah digunakan, JIT akan memadamkan pengiraan itu. Penanda aras Anda kemudiannya tidak mengukur apa-apa. JMH memberikan Anda dua alat untuk menghalangnya — memulangkan nilai dan Blackhole.

Perangkap DCE

Gelung ini mengira punca kuasa dua sejuta kali tetapi tidak pernah menggunakan hasilnya. Pengkompil yang pintar boleh memadamkan keseluruhan gelung.

public class Main {
    public static void main(String[] args) {
        long t = System.nanoTime();
        for (int i = 0; i < 1_000_000; i++) {
            double ignored = Math.sqrt(i); // result thrown away
        }
        System.out.println("ns: " + (System.nanoTime() - t));
    }
}

Pembaikan 1: Pulangkan Hasil

Pertahanan paling mudah ialah pulangkan nilai yang dikira daripada kaedah @Benchmark. JMH menggunakan setiap nilai yang dipulangkan, jadi JVM tidak dapat membuktikan bahawa nilai itu tidak digunakan.

import org.openjdk.jmh.annotations.Benchmark;

public class Bench {
    @Benchmark
    public double sqrt() {
        return Math.sqrt(42.0); // returned -> consumed by JMH
    }
}

Pembaikan 2: Blackhole

Apabila penanda aras menghasilkan beberapa nilai atau Anda tidak boleh memulangkan satu nilai, masukkan Blackhole dan panggil consume(...). Blackhole meyakinkan JIT bahawa setiap nilai digunakan, tanpa kos kerja sebenar.

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.infra.Blackhole;

public class Bench {
    @Benchmark
    public void manyValues(Blackhole bh) {
        for (int i = 0; i < 100; i++) {
            bh.consume(Math.sqrt(i));
        }
    }
}

Objek @State

Kelas @State menyimpan masukan yang legap kepada pengoptimum, sekali gus menghalang pelipatan pemalar. JMH menciptanya dan menghantarnya kepada penanda aras Anda. Skop boleh berupa Thread, Benchmark (dikongsi) atau Group.

import org.openjdk.jmh.annotations.*;

public class Bench {
    @State(Scope.Thread)
    public static class Data {
        public int x = 21;
    }

    @Benchmark
    public int multiply(Data d) {
        return d.x * 2; // d.x is not a compile-time constant
    }
}

@Setup dan @TearDown

Dalam kelas @State, kaedah yang dianotasi dengan @Setup berjalan sebelum pengukuran dan @TearDown berjalan selepasnya. Level mengawal kekerapan: Trial (sekali), Iteration atau Invocation.

import org.openjdk.jmh.annotations.*;

@State(Scope.Thread)
public class Data {
    int[] arr;
    @Setup(Level.Trial)
    public void init() {
        arr = new int[1000];
        for (int i = 0; i < arr.length; i++) arr[i] = i;
    }
}

Elakkan Masukan Pemalar

Jangan sekali-kali berikan pemalar literal kepada kaedah yang diuji. Math.sqrt(2.0) mungkin dilipat menjadi pemalar; Math.sqrt(state.value) tidak boleh. Sentiasa dapatkan masukan daripada medan @State.

Memulangkan Pelbagai Nilai

Jika penanda aras anda secara semula jadi menghasilkan dua hasil, anda boleh memulangkan satu hasil dan menggunakan hasil yang satu lagi melalui Blackhole, atau menggabungkan kedua-duanya. Membiarkan mana-mana hasil tidak digunakan akan membuka semula celah DCE.

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.infra.Blackhole;

public class Bench {
    @Benchmark
    public int twoResults(Blackhole bh) {
        int a = 3 * 7;
        int b = 5 + 9;
        bh.consume(b);
        return a;
    }
}

Overhed Blackhole

Blackhole direka supaya sangat murah dan tahan terhadap pengoptimuman, tetapi penggunaannya tidak sepenuhnya percuma. Untuk operasi yang amat pantas, utamakan pemulangan satu nilai; gunakan Blackhole untuk gelung dan kes yang menghasilkan pelbagai nilai.

Semak Kewajaran Nombor Anda

Jika penanda aras melaporkan masa yang mustahil rendah, seperti kurang daripada satu nanosaat untuk kerja sebenar, syaki DCE atau pelipatan pemalar. Semak semula bahawa hasil dipulangkan atau digunakan dan bahawa masukan datang daripada @State.

Menggabungkan Semuanya

Penanda aras yang teguh membaca masukan daripada objek @State, melaksanakan kerja, kemudian sama ada return hasil itu atau menggunakan hasil tersebut melalui Blackhole.consume. Dengan tiga amalan ini, DCE dan pelipatan pemalar tidak dapat memesongkan ukuran anda.

Semakan Ringkas

Uji pemahaman anda tentang cara mengatasi penghapusan kod mati.

Ringkasan

Anda telah mempelajari cara memastikan penanda aras kekal tepat:

  • Penghapusan kod mati memadam pengiraan yang tidak digunakan.
  • Pulangkan satu hasil supaya JMH menggunakannya.
  • Gunakan Blackhole.consume untuk gelung dan pelbagai nilai.
  • Objek @State menjadikan masukan tidak telus, lalu menghalang pelipatan pemalar.
  • @Setup / @TearDown menyediakan dan membersihkan keadaan pada aras yang dipilih.
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 “Mengelakkan Penghapusan Kod Mati” percuma?

Ya — teks penuh “Mengelakkan Penghapusan Kod Mati” 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 “Mengelakkan Penghapusan Kod Mati”?

Blackhole dan keadaan 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 4 daripada 4.

Berapa lamakah pelajaran “Mengelakkan Penghapusan Kod Mati” 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