Mengelakkan Penghapusan Kod Mati
Blackhole dan keadaan
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.
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
- Mengapa JMH
- Menulis Penanda Aras
- Pemanasan dan Lelaran
- Mengelakkan Penghapusan Kod Mati