0Pricing
Java Academy · Pelajaran

Menghindari Eliminasi Kode Mati

Blackhole dan state.

Menghindari Eliminasi Kode Mati adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Menghindari Penghapusan Kode Mati

Jebakan terbesar dalam tolok ukur mikro adalah penghapusan kode mati (DCE): jika JIT membuktikan bahwa suatu hasil tidak pernah digunakan, JIT menghapus perhitungannya. Tolok ukur Anda kemudian tidak mengukur apa pun. JMH memberi Anda dua alat untuk mencegahnya — mengembalikan nilai dan Blackhole.

Jebakan DCE

Perulangan ini menghitung akar kuadrat satu juta kali, tetapi tidak pernah menggunakan hasilnya. Kompiler yang cerdas dapat menghapus seluruh perulangan.

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));
    }
}

Perbaikan 1: Kembalikan Hasil

Pertahanan termudah adalah mengembalikan nilai yang dihitung dari metode @Benchmark. JMH menggunakan setiap nilai kembalian, sehingga JVM tidak dapat membuktikan bahwa nilai tersebut tidak diperlukan.

import org.openjdk.jmh.annotations.Benchmark;

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

Perbaikan 2: Lubang Hitam

Jika tolok ukur menghasilkan beberapa nilai atau Anda tidak dapat mengembalikan satu nilai, masukkan Blackhole dan panggil consume(...). Lubang hitam meyakinkan JIT bahwa setiap nilai digunakan, tanpa biaya pekerjaan nyata.

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 tidak terlihat oleh pengoptimal, sehingga mencegah pelipatan konstanta. JMH membuat instansinya dan meneruskannya ke tolok ukur Anda. Cakupannya dapat berupa Thread, Benchmark (dibagikan), 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

Di dalam kelas @State, metode yang diberi anotasi @Setup berjalan sebelum pengukuran dan @TearDown berjalan setelahnya. Level mengendalikan frekuensi: 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;
    }
}

Hindari Masukan Konstan

Jangan pernah memberikan konstanta literal kepada metode yang diuji. Math.sqrt(2.0) dapat dilipat menjadi konstanta; Math.sqrt(state.value) tidak dapat dilipat. Selalu ambil masukan dari field @State.

Mengembalikan Beberapa Nilai

Jika tolok ukur Anda secara alami menghasilkan dua hasil, Anda dapat mengembalikan salah satunya dan mengonsumsi yang lain melalui Blackhole, atau menggabungkan keduanya. Membiarkan salah satunya tidak dikonsumsi akan membuka kembali 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;
    }
}

Biaya Tambahan Blackhole

Blackhole dirancang agar sangat ringan dan tahan terhadap optimasi, tetapi penggunaannya tidak sepenuhnya tanpa biaya. Untuk operasi yang sangat cepat, sebaiknya kembalikan satu nilai; gunakan Blackhole untuk perulangan dan kasus dengan banyak nilai.

Periksa Kewajaran Angka Anda

Jika suatu tolok ukur melaporkan waktu yang sangat rendah dan tidak mungkin (kurang dari satu nanodetik untuk pekerjaan nyata), curigai DCE atau pelipatan konstanta. Periksa kembali apakah hasil dikembalikan atau dikonsumsi dan apakah masukan berasal dari @State.

Menyatukan Semuanya

Tolok ukur yang andal: baca masukan dari objek @State, lakukan pekerjaannya, lalu return hasilnya atau konsumsi hasil tersebut dengan Blackhole.consume. Dengan tiga kebiasaan ini, DCE dan pelipatan konstanta tidak dapat merusak pengukuran Anda.

Pemeriksaan Singkat

Uji pemahaman Anda tentang cara mencegah penghapusan kode mati.

Rangkuman

Anda telah mempelajari cara menjaga kejujuran tolok ukur:

  • Penghapusan kode mati menghapus perhitungan yang tidak digunakan.
  • Kembalikan satu hasil agar JMH mengonsumsinya.
  • Gunakan Blackhole.consume untuk perulangan dan banyak nilai.
  • Objek @State menjaga masukan tetap tidak transparan sehingga mencegah pelipatan konstanta.
  • @Setup / @TearDown menyiapkan dan membersihkan keadaan pada Tingkat yang dipilih.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menghindari Eliminasi Kode Mati” gratis?

Ya — teks lengkap “Menghindari Eliminasi Kode Mati” 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 “Menghindari Eliminasi Kode Mati”?

Blackhole dan state. 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 4 dari 4.

Berapa lama pelajaran “Menghindari Eliminasi Kode Mati” 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.

Semua pelajaran dalam kursus ini

  1. Mengapa JMH
  2. Menulis Benchmark
  3. Pemanasan dan Iterasi
  4. Menghindari Eliminasi Kode Mati
← Kembali ke Java Academy