SaxonHE ile Java ve Python Performans Karşılaştırması | Schematron Validasyonu
Schema — Schematron Validasyonu Nedir?
Günümüzde e-Fatura ve e-Defter gibi dijital süreçler, belirli standartlara uyum sağlamak zorundadır. Bu süreçlerde Schema ve Schematron gibi teknolojiler, veri doğrulama ve iş kurallarının uygulanmasında kritik bir rol oynar.
- Schema (XSD), XML belgelerinin yapısal olarak doğruluğunu kontrol eder. Bir XML belgesinin belirli bir formatta olup olmadığını kontrol etmek için kullanılır. Örneğin, bir e-Fatura XML belgesinde belirli bir kök öğenin bulunup bulunmadığını, belirli alanların zorunlu olup olmadığını veya belirli veri tiplerine uygun olup olmadığını kontrol edebilir.
- Schematron, daha esnek kurallar tanımlamak için kullanılan bir XML doğrulama dili olup iş kurallarının uygulanmasını sağlar. Örneğin, belirli bir faturanın KDV oranının %18 olması gerekiyorsa, bu kontrolü Schematron ile yapabiliriz.
Yani, Schema yalnızca veri yapısının geçerli olup olmadığını denetlerken, Schematron iş mantığını doğrulamak için kullanılır. Bu doğrulama süreçlerinde performans kritik bir faktördür. Özellikle büyük ölçekli XML verileri işlendiğinde, verimli bir XML işleme motoru kullanmak büyük fark yaratır. İşte burada Saxon devreye giriyor.
SaxonHE Nedir ve Neden Önemlidir?
SaxonHE (Home Edition), Saxon kütüphanesinin ücretsiz dağıtımıdır, güçlü bir XSLT ve XQuery işleme motorudur. XML dönüşümleri ve doğrulamaları hızlandırmak için optimize edilmiştir. Schematron validasyonu XSLT kullanılarak gerçekleştirilir. Saxon kütüphanesinin Enterprise sürümü, .sch dosyalarını doğrudan yüksek performansla işleyebilirken, Home Edition sürümünde Schematron dosyaları önce XSLT’ye dönüştürülmeli ve ardından XSLT işlenmelidir. Bu ek dönüşüm süreci, özellikle büyük XML belgelerinde performans kaybına neden oluyor ve performans ihtiyacı tam da burada devreye giriyor: Büyük ölçekli XML verileri işlenirken, yüksek hız ve verimlilik sağlayan bir doğrulama motoru kullanmak kritik hale geliyor.
Saxon hakkında daha fazla bilgi almak için resmi dökümana göz atabilirsiniz.
Java ve Python’da Saxon Kullanımı
Saxon kütüphanesi birçok platform için destek sağlıyor. Desteklenen dilleri resmi dökümanda bulabilirsiniz. Araştırmalarımı ve karşılaştığım projeleri değerlendirdiğimde .Net ve Java dillerinde yakın performans alırken Python’da kayda değer bir performans kazancı gözlemledim ve bu makalede, SaxonHE kullanarak Java ve Python ile geliştirdiğim web servislerin performans farklarını paylaşacağım.
Not: Eskiden Saxon kütüphanesini Python ile kullanmak için Cython gibi ara katmanlara ihtiyaç duyuluyordu. Bunun sebebi, Saxonica’nın temelinde C/C++ ile yazılmış bir Schematron doğrulama motoru kullanması ve diğer diller için birer Wrapper/Sarmalayıcı oluşturmuş olmasıydı. Bu yüzden Python’da Saxon kullanabilmek için ekstra yapılandırmalar gerekiyordu.
Ancak artık pip install saxonche komutu ile SaxonHE Python ortamına kolayca entegre edilebiliyor. Yani, eskiden olduğu gibi Cython ile uğraşmaya gerek kalmadan, doğrudan Python ortamında Saxon’un gücünden faydalanabilirsiniz. İlgili dökümana göz atmak için tıklayabilirsiniz.
Kurulum için Python tarafında pip install saxonche komutu yeterli, Java için ise SaxonHE güncel maven bağımlılığını pom.xml dosyanıza eklemelisiniz. İlgili bağımlılığa göz atmak için tıklayabilirsiniz.
Java’da Spring Boot kullanarak oluşturduğum, Python’da ise FastAPI kullanarak oluşturduğum web serviste aynı örneği gerçekleştirdim. Temel olarak /validate servisine istek atıldığında servis örnek bir xml ve xslt dosyasını alarak validasyon işlemi gerçekleştiriyor. Kod detayına girmeyeceğim fakat incelemek isterseniz ilgili repolar:
Java ve Python’da Performans Karşılaştırması
Geliştirdiğim her iki projeyi çalıştırıp aşağıdaki bash script dosyası ile test edildiğinde alınan sonucu birlikte yorumlayalım.
#!/bin/bash
# Zamanları saklamak için değişkenler
python_total_time=0
java_total_time=0
# 20 istek atılacak döngü
for i in {1..20}; do
# Python servisi (Port 8000)
python_response_time=$(curl -w "%{time_total}" -o /dev/null -s http://localhost:8000/validate)
python_total_time=$(echo "$python_total_time + $python_response_time" | bc)
# Java servisi (Port 8080)
java_response_time=$(curl -w "%{time_total}" -o /dev/null -s http://localhost:8080/validate)
java_total_time=$(echo "$java_total_time + $java_response_time" | bc)
done
# Ortalamaları hesapla (nano saniye hassasiyetine kadar)
python_average_time=$(echo "scale=6; $python_total_time / 20" | bc)
java_average_time=$(echo "scale=6; $java_total_time / 20" | bc)
# Sonuçları ekrana yazdır
echo "Python Servisi Ortalaması (Port 8000): $python_average_time saniye"
echo "Java Servisi Ortalaması (Port 8080): $java_average_time saniye"
Boyutu 70 Mb olan bir (E-Defter) xml dosyası ile gerçekleştirdiğim bu performans testinde aldığım sonuçlar şu şekilde:
Python Servisi Ortalaması (Port 8000): 8.464075 saniye
Java Servisi Ortalaması (Port 8080): 12.196512 saniye
Görüldüğü üzere Python, Java’ya kıyasla yaklaşık %30 daha hızlı çalışıyor. Sunucu kaynaklarını göz önünde bulundurduğumuzda süreler değişse de %30'luk bu oranı ciddi şekilde fark yaratan bir performans olarak değerlendirebiliriz.
Sonuç
Eğer büyük XML dosyaları işliyorsanız ve performans sizin için önemliyse, SaxonHE kullanımı ciddi bir fark yaratabilir. Python, özellikle hız açısından Java’ya kıyasla avantaj sağladı. Ancak, hangi dilin sizin için en uygun olduğu, mevcut sisteminize ve gereksinimlerinize bağlı olacaktır. Dilerseniz siz de bu makalede değindiğim projeleri inceleyerek ve çalıştırarak performansı test edebilirsiniz. İyi çalışmalar dilerim.