Benchmark Yazma
@Benchmark ve kipler
Benchmark Yazma, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. 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.
Bir Performans Ölçümü Yazma
JMH performans ölçümü, normal bir sınıfın içindeki @Benchmark ek açıklamasına sahip bir yöntemden ibarettir. JMH'nin ek açıklama işleyicisi, bunun çevresindeki çatıyı oluşturur. Bu derste, neyi ve nasıl ölçeceğinizi belirleyen ek açıklamalar ele alınır.
@Benchmark Ek Açıklaması
Herhangi bir genel yöntemi @Benchmark ile işaretlediğinizde JMH bu yöntemi art arda çağırır ve her çağrıyı zamanlar. JMH'nin tüketebilmesi için yöntemin dönüş değeri atılmamalı, döndürülmelidir.
Minimal Performans Ölçümü Sınıfı
Bir performans ölçümünün yapısı aşağıdaki gibidir. İçe aktarma ifadesi org.openjdk.jmh.annotations.* şeklindedir. JMH bu çalıştırıcının sınıf yolunda bulunmadığından bu yalnızca örnek amaçlıdır.
import org.openjdk.jmh.annotations.Benchmark;
public class StringBench {
@Benchmark
public String concat() {
return "foo" + System.nanoTime();
}
}Performans Ölçümü Kipleri
@BenchmarkMode, raporlanacak şeyi seçer:
- İş Hacmi — zaman birimi başına işlemler (yüksek olması daha iyidir).
- AverageTime — işlem başına süre (düşük olması daha iyidir).
- SampleTime — sürelerin dağılımı (yüzdelik dilimler).
- SingleShotTime — tek çağrı; soğuk başlangıç için uygundur.
import org.openjdk.jmh.annotations.*;
public class Bench {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
public int work() {
return 2 + 2;
}
}Çıktı Birimlerini Seçme
@OutputTimeUnit, sayıların okunabilir olması için rapordaki zaman birimini belirler. Hızlı bir işlem için nanosaniyeler, yavaş bir işlem için milisaniyeler uygundur.
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
public class Bench {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public int work() {
return 42;
}
}Sonuçları Döndürme
Yapılan işin sonucunu her zaman döndürün. JMH, ölü kod kaldırmayı önlemek için döndürülen değerleri otomatik olarak bir Kara Delik'e aktarır. Hesaplama yapıp sonucu atan bir void performans ölçümü klasik bir hatadır.
Ek Açıklama Varsayılanları
Ek açıklamalar yöntemin veya sınıfın tamamının üzerine yazılabilir. Sınıf düzeyindeki ek açıklamalar, o sınıftaki her @Benchmark için geçerlidir; bu, birden çok ilişkili performans ölçümünüz olduğunda yapılandırmayı DRY tutar.
Çatallama
@Fork(n), performans ölçümünü n yeni JVM sürecinde çalıştırır. Çatallama, her çalıştırmayı önceki performans ölçümlerinin oluşturduğu JIT profillerinden yalıtarak tekrarlanabilirliği artırır. Varsayılan değer bir çatallamadır.
import org.openjdk.jmh.annotations.*;
@Fork(2)
public class Bench {
@Benchmark
public long now() {
return System.nanoTime();
}
}Çalıştırıcıyı Başlatma
Performans ölçümlerini, bir Options nesnesi ve bir Runner yapılandıran main aracılığıyla veya oluşturulan çalıştırılabilir JAR üzerinden başlatırsınız. include(...) düzenli ifadesi, hangi performans ölçümlerinin çalıştırılacağını seçer.
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.*;
public class Launcher {
public static void main(String[] args) throws Exception {
Options opt = new OptionsBuilder()
.include("Bench")
.build();
new Runner(opt).run();
}
}Çıktıyı Okuma
JMH, performans ölçümünün adı, kipi, örnek sayısı, puanı, puan hatası ve birimleriyle birlikte bir tablo yazdırır; örneğin: Bench.work avgt 25 3.142 +/- 0.011 ns/op. +/-, güven aralığıdır.
Performans Ölçümlerini Odaklı Tutma
Her performans ölçümü tek bir şeyi ölçmelidir. Hazırlığı, girdi/çıktı işlemlerini ve ölçülen işlemi bir araya getirmek sonucu belirsizleştirir. Yalnızca yoğun kullanılan yolun zamanlanması için hazırlığı, durumla birlikte ele alınan @Setup yöntemlerine taşıyın.
Kısa Kontrol
Performans ölçümleri yazma konusundaki kavrayışınızı sınayın.
Özet
JMH performans ölçümü yazmayı öğrendiniz:
- Bir yönteme @Benchmark ek açıklamasını ekleyin ve sonucu döndürün.
- @BenchmarkMode; İş Hacmi, AverageTime, SampleTime veya SingleShotTime kiplerinden birini seçer.
- @OutputTimeUnit okunabilir birimler belirler; @Fork çalıştırmaları yeni JVM'lerde yalıtır.
- Bir Runner ve Options ile veya oluşturulan JAR üzerinden başlatın.
- Her performans ölçümünü tek bir yoğun kullanılan yola odaklayın.
Sıkça Sorulan Sorular
“Benchmark Yazma” dersi ücretsiz mi?
Evet — “Benchmark Yazma” 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.
“Benchmark Yazma” dersinde ne öğreneceğim?
@Benchmark ve kipler 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 2. dersidir.
“Benchmark Yazma” 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.