Performans katmanı
- Java kursu
- Uzman
- Ders 44/46
- 6 dk
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
@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
@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
long start = System.____;
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 |