
JSON Nesnelerini Ara AST Olmadan Ayrıştırmak
Bir blog yazısı, JSON nesnelerinin kısmen başlatılmış bir değerle doğrudan alan tiplerine ayrıştırılmasını anlatıyor; ara AST hiç oluşturulmuyor. Mikro ölçümler yaklaşık üç kat daha hızlı ayrıştırma gösteriyor.
Çoğu JSON kütüphanesi aynı iki adımlı tarifi izler: önce ham baytları belgeyi yansıtan bir ara ağaca dönüştürür, sonra bu ağacı gezerek uygulamanın gerçekte kullandığı veri tiplerini kurar. arthi-chaud.github.io adresindeki bir blog yazısı, bu ara ağaç tamamen kaldırılırsa ne olacağını soruyor ve kısmen başlatılmış değerlere dayanan bir yaklaşım öneriyor.
Ara temsilin maliyeti
Yazar, alışılmış tasarımı bir boru hattı olarak anlatıyor: bir ayrıştırıcı ByteString'i JSON AST'sine çevirir, fromJSON gibi ayrı bir fonksiyon da bu AST'yi alan verisine, örneğin bir Album kaydına dönüştürür. Bu ayrım kullanışlıdır — ayrıştırma doğrulamadan bağımsız kalır ve dönüştürme kodu çoğu zaman Template Haskell veya Generics ile otomatik üretilebilir — ancak bedava değildir: AST, bellekte en az nihai değer kadar yer kaplayan ek bir nesnedir ve kurulması, alan nesnesi oluşur oluşmaz atılan fazladan hesaplama gerektirir.
Kısmen başlatılmış nesneler ve bit kümesi
Alternatif yaklaşım, kısmen başlatılmış bir alan nesnesini ayrıştırıcının içinden geçirir; alanlar okunur okunmaz yazılır ve hiç AST oluşturulmaz. Haskell'de bu, tembellik özelliğine dayanır: her alan undefined ile başlar, dolayısıyla hedef tipin alanları katı olmamalıdır. Güvenliği bir bit kümesi geri getirir: maxBound ile başlatılan bir Word64. Bir alan yazıldığında, tip tanımındaki konumundaki bit silinir; ayrıştırma bittiğinde kalan değerin sıfır olması nesnenin tamamen başlatıldığını kanıtlar. Aksi hâlde ayrıştırıcı hata verir ve eksik alanları hata mesajında sıralayabilir; tipi Maybe olan alanlar ise Nothing yapılarak kabul edilebilir.
Ölçümler ve sınırlar
Kavram kanıtı, flatparse kütüphanesiyle geliştirilmiş; özelleşmiş ayrıştırıcıları derleme zamanında Template Haskell üretiyor. İki Xeon Gold 6244 işlemcili ve 32 GB RAM'li bir Intel makinesinde Criterion mikro ölçümleri, Haskell'in ana JSON kütüphanesi aeson için bir kitapta 1.051 μs, kitap listesi olan bir yazarda 2.901 μs gösteriyor. Ara AST kullanan aynı kütüphane 922.7 ns ve 2.813 μs ölçülürken, AST olmadan bu değerler 314.2 ns ve 1.027 μs'ye indi — yaklaşık üç kat hızlı. Yazar, ayrıştırıcının JSON standardına tam uymadığını, kaçış karakterleri ve sayı biçimlerinin yalnızca bir kısmını desteklediğini ve bu tür mikro ölçümlerin gerçek uygulamaları yansıtmayabileceğini belirtiyor.
Deney ne gösteriyor
Yazı, ara temsillere karşı bir argüman olmadığını açıkça söylüyor: onlar ayrıştırmayı doğrulamadan ayırır ve kodu bakımı kolay tutar. Anlatılmak istenen, bu ayrımın çalışma zamanı maliyeti ve hız önemli olduğunda iki adımı birleştirmenin daha az zarif ama işleyen bir ödünleşim olduğu. Fikir de yeni değil: Rust'ın serileştirme çatısı serde, ara katmanı staged programlama ile derleme zamanına taşıyor; katı dillerde aynı numara undefined yerine boş değerlerle başlayabilir.
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.