Yazılım Geliştirme: Java Kayıt Performansı
Java'nın (cepheleri kaydeden en iyi uygulama) kaydı ile ilgili önceki yazılarda, kayıt konusunda çok sayıda Java kitapçısı olduğunu söylemiştim. Son yazıda birkaç logcerin bir cephe ile nasıl birleştirileceğini açıklığa kavuşturduktan sonra, şimdi kayıt kitaplıklarının performansına bakmak istiyoruz.

Hendrik Advers (@hendrikebbers), JCP uzman grubunun bir üyesi olan Java'nın şampiyonu ve farklı Javaone rock yıldızı hoparlörleri aldı. Kendi açık unsurları şirketi ile Hendrik şu anda Hedera Hashgraph'ı tasarlamaya ve hizmetlerini halka açık hale getirmeye yardımcı oluyor. Hendrik aynı zamanda Juug Dortmund ve Cyberland tarafından ve tüm dünyada Java teması hakkında dersler ve seminerler düzenliyor. “Mastering JavaFx 8 Controls” adlı kitabı 2014 yılında Oracle Press tarafından yayınlandı. Hendrik, TSC Emptopenjdk ve Eclipse WG benimseyenlerin bir üyesidir.
Java'da performansın ölçümü
Bir uygulamanın veya Java kütüphanesinin küçük bölümlerini bir referans noktası kullanarak kontrol etmek için, OpenJDK tarafından sağlanan Java Microbenchmark (JMH) aracı, performans referans parametrelerini gerçekleştirmek için Java'da mevcuttur. Birim testlerine benzer şekilde, uygulamanın küçük bölümlerini (mikro kıyaslama) gerçekleştirir ve bunları analiz eder. Diğer şeylerin yanı sıra, kodun “ısıtma” JVM ve JIT'den önce birkaç saniye olmadan birkaç saniye geçip geçmeyeceğini ayarlayabilirsiniz.
Bu ve diğer parametreler, JUNIT'e benzer şekilde JMH'ye ek açıklamalarla kolayca tanımlanabilir. Referans noktasının basit bir örneği şu gibi görünüyor:
@Benchmark
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 4, time = 4)
@Measurement(iterations = 4, time = 4)
public void runSingleSimpleLog() {
logger.log("Hello World");
}
Örnek ısıtma için dört nokta, ardından dört ölçüm çalışması yapar. Her yarış dört saniye gerektirir ve ölçüm sonucu saniyede kaç operasyon yapılabileceğini gösterir. Özellikle, bu “merhaba dünya” nın genellikle kaydedilebileceği anlamına gelir. Her şey yürütüldükten sonra komut satırında yayılır, ancak örneğin bir JSON veya CSV dosyası olarak da kaydedebilir.
Java logger için performans ölçümü
JMH'nin yardımıyla, GitHub'da görülebilen kayıt çerçevesi için açık kaynak referans noktası oluşturdum. Halen hizmetleri için aşağıdaki kayıt kitaplıklarını veya yapılandırmalarını kontrol ediyor:
- Konsolda kayıt ile Temmuz (java.util.logging)
- Bir dosyaya erişim ile Temmuz (java.util.logging)
- Konsolda ve bir dosyada kayıt ile Temmuz (java.util.logging)
- Bir dosyaya erişim ile basit SLF4J
- Konsolda kayıtlı log4j2
- Bir dosyaya erişim ile log4j2
- Konsolda ve bir dosyada kayıt ile log4j2
- Bir dosyada eşzamansız kayıtlı log4j2
- Bir dosyada eşzamansız kayıtlı logger cronicle
Ölçümler, kayıt resimlerinin genellikle çok performans gösterdiğini göstermektedir. Öte yandan, kesinlikle herkes için doğrudan net olmayan bazı keşifler de ortaya koydular.
Aşağıda, “Merhaba Dünya” mesajının basit günlüğünde ölçüm sonuçlarına genel bir bakış::

Konsolla ilgili sorun
Ölçümlerin ilk sonucu, konsolun kaydının her zaman dosya sistemine erişimden önemli ölçüde daha yavaş olmasıdır. Kayıt sırasında saniyede logger'ın 200.000 ila 300.000 görünümüne ulaşmak mümkün olsa da, konsollardaki bir çıktı için her zaman 100.000'den az işlemdi. Tüm kayıt kitaplıklarından beri System.out VEYA System.err Çalışırken, kitapçı kullanan performansta neredeyse hiçbir fark yoktur. Gelecekte, hileler veya dönüşümlerle daha iyi performans elde edip edemeyeceğinizi görmek heyecan verici olacak.
Dosyalarda senkron ve eşzamansız kayıt
Bir dosyadaki senkron veya asenkron kaydın ölçülen değerlerine baktığınızda başka bir büyük fark görebilirsiniz. Burada, eşzamansız kaydın çok daha hızlı olduğu hemen anlaşılıyor. Aşağıdaki tablolar, eşzamanlı kayıt ile ilgili olarak eşzamansız kaydın ölçülen değerlerini göstermektedir:

Açıkçası daha büyük performanslar, eşzamansız girişcinin yazma işleminin engellenmemesidir. Logger Log4J2 ve Chronicle Logger, dahili olarak farklı kitapçılar kullanır, ancak her ikisi de “blok olmayan yasalar arasında iletişim kütüphanesi” na dayanmaktadır. LMAX dağılıcısı, zil tamponu yoluyla dahili olarak eşzamansız kaydı izin veren bir kütüphane olarak eklenmelidir, Chronicle Logger doğrudan kuyruk kitaplığının Chronicle'sine dayanmaktadır.

Belgeler, dahili olarak kullanılan kütüphanelerin somut tanımında ve asenkron iletişime veya dosya sistemine nasıl yazılmasına izin verdikleri.
Log4J2 ve Chronicle Logger'ın performansını karşılaştırırsanız, Chronicle Logger'ın yine çok daha hızlı olduğunu görebilirsiniz. Bununla birlikte, performans için bu avantaj da farkında olmanız gereken bir dezavantaja sahiptir: Log4J2, eşzamansız modda bile, dosya sisteminde insanlar için okunması kolay bir kayıt oluşturmaya devam ederken, Chronicle Logger tüm mesajları ikili formatta yazar. Bu nedenle logger'ın sağladığı bir okuma veya analiz aracı gereklidir. Ek olarak, Chronicle Logger testinin sonuçlarının varyansı önemli ölçüde daha yüksektir. Bir sebep olarak, Chronicle Tail'in kullandığı, kaydı dahili olarak yazmak için ikili verileri yönettiğinden ve her zaman dinamik olarak adapte olduğundan şüpheleniyorum. Ancak, bu daha fazla incelenmelidir. Aşağıdaki tablo varyansa genel bir bakış göstermektedir:

Çözüm
Gördüğünüz gibi, sadece bir kayıt kitaplığı seçimi değil, aynı zamanda yapılandırması performans için son derece önemlidir. Geliştirme sırasında konsola erişim kesinlikle çok hoş olsa da, örneğin, canlı işlemde konsol kaydının kullanımının her zaman gerekli olup olmadığını düşünmek. Ayrıca, sistem performansı gerçekten kritik ise asenkron loger kullanımının mantıklı olabileceğini de gösterir. Tabii ki, bu daha fazla karmaşıklığa ve daha fazla geçiş bağımlılığına sahiptir. Sonunda, her proje hangi logger'ın mantıklı olduğuna karar vermeye devam etmelidir. Ancak burada belirtilen rakamlarla, şimdi bunu ayarlamak için başka bir tabanınız var.
(RME)