Ölü Kodun Elenmesinden Kaçınma
Blackhole ve durum
Ölü Kodun Elenmesinden Kaçınma, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Ölü Kod Kaldırmadan Kaçınma
En büyük mikro ölçüm tuzağı ölü kod kaldırmadır (DCE): JIT bir sonucun hiç kullanılmadığını kanıtlarsa hesaplamayı siler. Bu durumda performans ölçümünüz hiçbir şeyi ölçmez. JMH bunu önlemek için size iki araç sunar: değerleri döndürmek ve Blackhole.
Ölü Kod Kaldırma Tuzağı
Bu döngü bir karekökü bir milyon kez hesaplıyor, ancak sonucu hiç kullanmıyor. Akıllı bir derleyici döngünün tamamını silebilir.
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));
}
}1. Çözüm: Sonucu Döndürme
En kolay savunma, hesaplanan değeri @Benchmark yönteminden döndürmektir. JMH döndürülen her değeri tükettiği için JVM bunun ölü olduğunu kanıtlayamaz.
import org.openjdk.jmh.annotations.Benchmark;
public class Bench {
@Benchmark
public double sqrt() {
return Math.sqrt(42.0); // returned -> consumed by JMH
}
}2. Çözüm: Kara Delik
Bir performans ölçümü birden çok değer ürettiğinde veya tek bir değer döndüremediğinizde bir Blackhole ekleyin ve consume(...) çağrısını yapın. Kara Delik, gerçek işin maliyetine katlanmadan JIT'yi her değerin kullanıldığına ikna eder.
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));
}
}
}@State Nesneleri
Bir @State sınıfı, eniyileyici için opak olan girdileri tutarak sabit katlamayı engeller. JMH bu sınıfın örneğini oluşturur ve sınıfı performans ölçümünüze aktarır. Kapsam Thread, Benchmark (paylaşılan) veya Group olabilir.
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 ve @TearDown
Bir @State sınıfının içindeki @Setup ek açıklamasına sahip yöntemler ölçümden önce, @TearDown ek açıklamasına sahip yöntemler ise sonra çalışır. Level sıklığı denetler: Trial (bir kez), Iteration veya 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;
}
}Sabit Girdilerden Kaçının
Test edilen metoda hiçbir zaman sabit değerler vermeyin. Math.sqrt(2.0) bir sabite dönüştürülebilir; Math.sqrt(state.value) ise dönüştürülemez. Girdileri her zaman bir @State alanından alın.
Birden Çok Değer Döndürme
Kıyaslamanız doğal olarak iki sonuç üretiyorsa birini döndürebilir, diğerini bir Blackhole üzerinden tüketebilir veya sonuçları birleştirebilirsiniz. Sonuçlardan herhangi birini tüketmeden bırakmak DCE açığını yeniden ortaya çıkarır.
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;
}
}Blackhole Ek Yükü
Blackhole son derece düşük maliyetli olacak ve kendisi de eniyileştirmeye direnç gösterecek şekilde tasarlanmıştır; ancak tamamen ücretsiz değildir. Çok hızlı işlemlerde tek bir değer döndürmeyi tercih edin; Blackhole'u döngüler ve birden çok değer üreten durumlar için kullanın.
Sayılarınızı Gerçeklik Kontrolünden Geçirin
Bir kıyaslama gerçek bir işlem için olanaksız derecede düşük bir süre bildiriyorsa (bir nanosaniyenin altında), DCE'den veya sabit katlamadan şüphelenin. Sonuçların döndürüldüğünü ya da tüketildiğini ve girdilerin @State içinden geldiğini yeniden kontrol edin.
Hepsini Bir Araya Getirme
Sağlam bir kıyaslama, girdileri bir @State nesnesinden okur, işlemi gerçekleştirir ve sonucu ya return eder ya da Blackhole.consume ile tüketir. Bu üç alışkanlık sayesinde DCE ve sabit katlama ölçümlerinizi bozamaz.
Hızlı Kontrol
Kullanılmayan kodun kaldırılmasını nasıl engelleyeceğinizi anlayıp anlamadığınızı test edin.
Özet
Kıyaslamaları güvenilir tutmayı öğrendiniz:
- Kullanılmayan kodun kaldırılması, kullanılmayan hesaplamaları siler.
- JMH'nin tüketmesi için tek bir sonucu döndürün.
- Döngüler ve birden çok değer için Blackhole.consume kullanın.
- @State nesneleri girdileri opak tutarak sabit katlamayı engeller.
- @Setup / @TearDown, durumu seçilen düzeyde hazırlar ve temizler.
Sıkça Sorulan Sorular
“Ölü Kodun Elenmesinden Kaçınma” dersi ücretsiz mi?
Evet — “Ölü Kodun Elenmesinden Kaçınma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Ölü Kodun Elenmesinden Kaçınma” dersinde ne öğreneceğim?
Blackhole ve durum Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Ölü Kodun Elenmesinden Kaçınma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- JMH Neden Kullanılır
- Benchmark Yazma
- Isınma ve Yinelemeler
- Ölü Kodun Elenmesinden Kaçınma