Java
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.
Örnek çözümü göster
@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");
}
}
Kendini test et
-
Performans katmanı neyi ölçer?
- Yayın süresi
- Bellek adresi
- Disk alanı
- Thread sayısı
Cevabı göster
Yayın süresi — TimedPublisher yayının geçen süresini ölçer.
-
zaman ölçüm çağrısını tamamla
long start = System.____;
Cevabı göster
long start = System.nanoTime();
-
performans öğelerini eşleştir
- nanoTime
- Yüksek çözünürlüklü saat
- TimedPublisher
- Süre ölçen sarmalayıcı
- delegate
- Sarmalanan yayıcı
- decorator
- Sarmalama deseni
Sıradaki ders: Mikro hizmet temeli