
JSON obyektlərinin ara AST olmadan parse edilməsi
Bloq yazısı JSON obyektlərinin yarımçıq inisializə edilmiş dəyər vasitəsilə birbaşa domen tiplərinə çevrilməsini təsvir edir; ara AST heç yaradılmır. Mikro ölçmələr təqribən üç dəfə yüksək sürət göstərir.
JSON kitabxanalarının çoxu eyni iki mərhələli sxemi izləyir: əvvəlcə xam baytları sənədi təkrarlayan ara ağaca çevirir, sonra bu ağacı gəzərək tətbiqin həqiqətən istifadə etdiyi verilənlər tiplərini qurur. arthi-chaud.github.io ünvanındakı bloq yazısı ara ağac tamamilə çıxarılsa nə olacağını soruşur və yarımçıq inisializə edilmiş dəyərlərə əsaslanan yanaşma təklif edir.
Ara təsvirin maliyyəti
Müəllif adi dizaynı boru kəməri kimi təsvir edir: parser ByteString-i JSON AST-yə çevirir, fromJSON kimi ayrı funksiya isə bu AST-ni domen veriləninə, məsələn Album qeydinə çevirir. Bu bölgü rahatdır — parse addımı validasiyadan asılı olmayaraq qalır, çevirmə kodu isə çox vaxt Template Haskell və ya Generics ilə avtomatik yaradıla bilir — amma pulsuz deyil: AST yaddaşda ən azı yekun dəyər qədər yer tutan əlavə obyektdir və onun qurulması domen obyekti yaranan kimi atılan əlavə hesablama tələb edir.
Yarımçıq inisializə edilmiş obyektlər və bit çoxluğu
Alternativ yanaşma yarımçıq inisializə edilmiş domen obyektini parserin özündən keçirir: sahələr oxunduğu anda yazılır və AST heç vaxt yaradılmır. Haskell-də bu, tənbəlliyə söykənir: hər sahə undefined ilə başlayır, buna görə hədəf tipin sahələri sərt olmamalıdır. Təhlükəsizliyi bit çoxluğu bərpa edir — maxBound ilə başlayan Word64. Sahə yazıldıqca tip tərifindəki mövqeyindəki bit silinir, parse bitdikdə qalan sıfır dəyəri obyektin tam inisializə olunduğunu təsdiqləyir. Əks halda parser uğursuz olur və xəta mesajında çatışmayan sahələri sadalaya bilir; tipi Maybe olan sahələri isə sadəcə Nothing etmək kifayətdir.
Ölçmələr və məhdudiyyətlər
Prototip flatparse kitabxanası ilə qurulub, ixtisaslaşdırılmış parserləri isə kompilyasiya zamanı Template Haskell yaradır. İki Xeon Gold 6244 prosessoru və 32 GB RAM olan Intel maşınında Criterion mikro ölçmələri Haskell-in əsas JSON kitabxanası aeson üçün kitabda 1.051 μs, kitab siyahısı olan müəllifdə 2.901 μs göstərir. Ara AST istifadə edən eyni kitabxana 922.7 ns və 2.813 μs, AST olmadan isə 314.2 ns və 1.027 μs nəticə verir — təqribən üç dəfə sürətli. Müəllif qeyd edir ki, parser JSON standartına tam uyğun deyil, qaçış simvolları və ədəd formatlarının yalnız bir hissəsi dəstəklənir və bu cür mikro ölçmələr real tətbiqləri həmişə əks etdirmir.
Təcrübə nə göstərir
Yazı aydın şəkildə bildirir ki, bu, ara təsvirlərə qarşı arqument deyil: onlar parsi validasiyadan ayırır və kodu saxlanıla bilən edir. Söhbət bu ayrılığın işləmə vaxtı maliyyətindən və sürət vacib olduqda iki mərhələnin birləşdirilməsinin daha az zərif, amma işlək güzəşt olmasından gedir. İdeya da yeni deyil: Rust-ın serde çərçivəsi staged proqramlaşdırma ilə ara qatı kompilyasiya vaxtına keçirir, sərt dillərdə isə eyni üsul undefined əvəzinə boş dəyərlərdən başlaya bilər.
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.