दरअसल किसी विकल्प की ज़रूरत नहीं है
ruby/json, oj से थोड़ा धीमा है, लेकिन अंतर बड़ा नहीं है।
oj अपनी performance की वजह से लोकप्रिय है, लेकिन यह कई समस्याएँ पैदा कर सकता है।
oj की समस्याओं में से एक Oj.mimic_JSON के ज़रिए monkey patching से पैदा होने वाली security समस्या है।
monkey patching की ज़िम्मेदारी
Oj.mimic_JSON और Oj.optimize_rails, JSON के कम efficient implementation को replace करते हैं, लेकिन इससे समस्याएँ हो सकती हैं।
- उदाहरण के लिए, यह
script_safe option को ignore कर सकता है, जिससे XSS attack की आशंका बढ़ सकती है।
- monkey patching बहुत सावधानी से की जानी चाहिए, और API के evolution के साथ सुरक्षित तरीके से निपटना चाहिए।
अस्थिरता
- बड़े पैमाने के production environments में
oj, Ruby crashes के मुख्य कारणों में से एक रहा है।
oj बहुत सक्रिय रूप से विकसित हो रहा है, इसलिए नए crash अक्सर सामने आते हैं।
oj के codebase में ऐसे गंदे hacks मौजूद थे जिन पर भरोसा करना मुश्किल था।
बुनियादी काम
- लक्ष्य यह था कि
ruby/json को oj जैसी performance के करीब बेहतर बनाया जाए, ताकि monkey patching की ज़रूरत कम हो।
- benchmark सेट किए गए और performance analysis के लिए C profiler का उपयोग किया गया।
duplicate checks से बचना
JSON.dump benchmark में duplicate UTF-8 checks से बचकर performance सुधारी गई।
rb_enc_str_asciionly_p और isLegalUTF8 के बीच duplicate काम हटाकर 3% performance improvement हासिल किया गया।
पहले सस्ते और अधिक संभावित condition की जाँच
fbuffer_inc_capa function में buffer पहले से allocated है या नहीं, इसकी condition को optimize करके 15% performance improvement हासिल किया गया।
setup cost कम करना
ruby/json की setup cost कम करके micro-benchmark में performance को काफी बेहतर बनाया गया।
pointer chasing से बचना
rb_enc_get call हटाकर performance में 8% सुधार किया गया।
lookup table
- lookup table का उपयोग करके JSON string dump की performance में 30% सुधार किया गया।
आगे जारी
- और भी कई optimizations हैं, जिन्हें अगली पोस्ट में कवर किया जाएगा।
1 टिप्पणियां
Hacker News राय
Rails में डिफ़ॉल्ट jbuilder का उपयोग JSON रेंडरिंग को धीमा बनाने वाले कारणों में से एक है
यह जानने की जिज्ञासा है कि क्या नए वर्ज़न में Twitter JSON dump को parse/encode करने में लगने वाले समय की जानकारी है
इस विषय पर लिखा गया लेख बहुत आसानी से समझ में आता है, और Ruby कोड को benchmark और optimize करने का मन करता है
शानदार लेख और काम है
यह बहुत दिलचस्प लेख है
byroot के काम से बहुत प्रभावित हूँ
C profiler पर दी गई सलाह शानदार थी
Mame के PR में इस्तेमाल की गई "lookup table" नाम की performance trick प्रभावशाली थी
String#each_charकी जगहString#each_codepointका उपयोग करने से GC का बोझ कम किया जा सकता हैअपने codebase में performance को और बेहतर बनाने का एक उदाहरण साझा किया गया
Stringमें बदलने के लिएArray#packका उपयोग किया गयाआधुनिक CPU में branch prediction hints बेकार हैं
यह जानने की जिज्ञासा है कि क्या Ruby JSON intrinsic का उपयोग करता है