CodeBlanks Logo Icon CodeBlanks

Performans katmanı

JMH ve GC ayarı ile performans ölçümü yazarsın.

performans ölçüm katmanı

Performans katmanı, reaktif yayını süre ölçümüyle sarar. TimedPublisher bir SimplePublisher delegate'i sarar; publish öncesi ve sonrası System.nanoTime() alır, geçen süreyi hesaplar. Bu, decorator desenidir.

Süre değişken olduğu için çıktıya doğrudan yazdırmak yerine, ölçümün yapıldığını belirten sabit bir işaret yazdırırız. Böylece çıktı deterministik kalır.

decorator deseni

TimedPublisher, SimplePublisher'ı sarmadan önce onu kurucuda alır ve delegate alanında tutar. publish çağrılınca önce ölçümü yapar, sonra delegate'in publish'ini çağırır. Bu, decorator desenidir: nesne davranışını sarmadan değiştirir.

Decorator, miras yerine kompozisyon kullanır. Bu yüzden esnektir; istenen her yayıcıyı sarabilir.

Uygulama TimedPublisher sınıfını yaz

Üstteki yapıya class TimedPublisher ekle; SimplePublisher delegate alanı ve TimedPublisher(SimplePublisher delegate) yapıcısı olsun. void publish(String item) metodu önce long start = System.nanoTime();, sonra delegate.publish(item);, sonra long elapsed = System.nanoTime() - start; yapsın ve System.out.println("elapsed measured: " + (elapsed >= 0)); yazdırsın. main içinde SimplePublisher p = new SimplePublisher(); oluştur, abone ekle ve new TimedPublisher(p).publish("hello"); çağır.

Başlangıç kodu

Main.java
@interface Service {}

@Service
class HelloService {
    String greet() { return "hello"; }
}

interface Subscriber {
    void onNext(String item);
}

class SimplePublisher {
    java.util.List<Subscriber> subs = new java.util.ArrayList<>();
    void subscribe(Subscriber s) { subs.add(s); }
    void publish(String item) {
        for (Subscriber s : subs) s.onNext(item);
    }
}

public class Main {
    public static void main(String[] args) {
        SimplePublisher p = new SimplePublisher();
        p.subscribe(s -> System.out.println("got: " + s));
        p.publish("hello");
    }
}

Örnek çözüm

Main.java
@interface Service {}

@Service
class HelloService {
    String greet() { return "hello"; }
}

interface Subscriber {
    void onNext(String item);
}

class SimplePublisher {
    java.util.List<Subscriber> subs = new java.util.ArrayList<>();
    void subscribe(Subscriber s) { subs.add(s); }
    void publish(String item) {
        for (Subscriber s : subs) s.onNext(item);
    }
}

class TimedPublisher {
    SimplePublisher delegate;
    TimedPublisher(SimplePublisher delegate) {
        this.delegate = delegate;
    }
    void publish(String item) {
        long start = System.nanoTime();
        delegate.publish(item);
        long elapsed = System.nanoTime() - start;
        System.out.println("elapsed measured: " + (elapsed >= 0));
    }
}

public class Main {
    public static void main(String[] args) {
        SimplePublisher p = new SimplePublisher();
        p.subscribe(s -> System.out.println("got: " + s));
        new TimedPublisher(p).publish("hello");
    }
}

Beklenen çıktı

got: hello
elapsed measured: true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Performans katmanı neyi ölçer?

  • Yayın süresi Doğru cevap
  • Bellek adresi
  • Disk alanı
  • Thread sayısı

Açıklama: TimedPublisher yayının geçen süresini ölçer.

2 zaman ölçüm çağrısını tamamla

Soru
long start = System.____;
Cevap
long start = System.nanoTime();

Açıklama: System.nanoTime() yüksek çözünürlüklü süre verir.

3 performans öğelerini eşleştir

Kavram Anlamı
nanoTime Yüksek çözünürlüklü saat
TimedPublisher Süre ölçen sarmalayıcı
delegate Sarmalanan yayıcı
decorator Sarmalama deseni

Uzman bölümündeki tüm dersler