Aslında bir alternatife gerek yok
ruby/json, oj'den biraz daha yavaştır, ancak aradaki fark büyük değildir.
oj, performansı nedeniyle popülerdir, ancak çeşitli sorunlara yol açabilir.
oj'nin sorunlarından biri, Oj.mimic_JSON aracılığıyla yapılan monkey patch nedeniyle ortaya çıkan güvenlik sorunlarıdır.
Monkey patch sorumluluğu
Oj.mimic_JSON ve Oj.optimize_rails, JSON'un daha az verimli uygulamasının yerini alır, ancak sorunlara neden olabilir.
- Örneğin
script_safe seçeneğini yok sayarak XSS saldırılarına karşı savunmasız hale getirebilir.
- Monkey patch dikkatle yapılmalı ve API'nin evrimine paralel olarak güvenli şekilde ele alınmalıdır.
Kararsızlık
oj, büyük ölçekli üretim ortamlarında Ruby çökmesinin başlıca nedenlerinden biriydi.
oj çok aktif biçimde geliştirildiği için yeni çökmeler sık sık ortaya çıkıyordu.
oj'nin kod tabanında güvenilmesi zor, kirli hack'ler bulunuyordu.
Temel çalışma
ruby/json'u oj'ye benzer performansa getirerek monkey patch ihtiyacını azaltmak amaçlandı.
- Benchmark kuruldu ve performansı analiz etmek için C profiler kullanıldı.
Yinelenen kontrollerden kaçınma
JSON.dump benchmark'ında yinelenen UTF-8 kontrolleri önlenerek performans iyileştirildi.
rb_enc_str_asciionly_p ile isLegalUTF8 arasındaki yinelenen iş kaldırılarak %3 performans artışı sağlandı.
Önce daha ucuz ve daha olası koşulları kontrol etme
fbuffer_inc_capa işlevinde, tamponun zaten ayrılmış olup olmadığını denetleyen koşul optimize edilerek %15 performans artışı sağlandı.
Kurulum maliyetini azaltma
ruby/json'un kurulum maliyeti azaltılarak mikro benchmark'larda performans ciddi biçimde iyileştirildi.
Pointer takibinden kaçınma
rb_enc_get çağrısı kaldırılarak performans %8 iyileştirildi.
Arama tablosu
- Arama tablosu kullanılarak JSON string dump performansı %30 iyileştirildi.
Devam edecek
- Daha fazla optimizasyon var, ancak bunlar bir sonraki yazıda ele alınacak.
1 yorum
Hacker News görüşleri
Rails’in varsayılan
jbuilderkullanımı, JSON render etmesini yavaşlatan etkenlerden birijbuilderile render etmek hızı düşürüyorYeni sürümün Twitter JSON dökümünü parse etme/kodlama süresiyle ilgili bilgi olup olmadığı merak ediliyor
Bu konudaki yazı çok kolay anlaşılır ve Ruby kodunu benchmark edip optimize etme isteği uyandırıyor
Harika bir yazı ve çalışma
Ojkullanmak için hâlâ bir neden olup olmadığı merak ediliyorOldukça ilgi çekici bir yazı
simdjsongibi kütüphanelerden yararlanılmadığı merak ediliyorbyroot’un çalışmalarına hayranlık duyuluyor
C profiler tavsiyesi harikaydı
Mame’in PR’ında kullanılan "lookup table" adlı performans hilesi etkileyiciydi
String#each_charyerineString#each_codepointkullanmak GC yükünü azaltabilirKendi kod tabanında performansı daha da artıran bir örnek paylaşılıyor
Stringe dönüştürmek içinArray#packkullanılıyorModern CPU’larda branch prediction hint’leri işe yaramıyor
Ruby JSON’un intrinsic kullanıp kullanmadığı merak ediliyor