- V8 इंजन में JSON.stringify फ़ंक्शन की परफ़ॉर्मेंस को दो गुना से अधिक बढ़ाया गया, जिससे डेटा serialization की गति बेहतर हुई
- side-effect रहित objects के लिए एक optimization path जोड़ा गया, जिससे कई defensive check लॉजिक छोड़े जा सके और सामान्य data objects में बड़ा speedup मिला
- string processing के दौरान 1-byte/2-byte विभाजन, SIMD का उपयोग, और temporary buffer structure में बदलाव जैसे hardware और memory स्तर के उन्नत तरीकों को लागू किया गया
- number conversion प्रक्रिया में मौजूदा Grisu3 algorithm को Dragonbox से बदल दिया गया, जिससे
Number.toString() कॉल्स में भी तेज़ conversion संभव हुआ
- कुछ arguments और object shapes में यह फिर सामान्य serialization path पर लौटता है, लेकिन ज़्यादातर web development स्थितियों में optimization का लाभ अपने-आप मिलता है
अवलोकन
JSON.stringify JavaScript में data को string में बदलने वाला एक core function है
- इस फ़ंक्शन की performance में सुधार का सकारात्मक असर network requests या localStorage save जैसी web की बहुत महत्वपूर्ण operations पर भी पड़ता है
- नवीनतम V8 engineering के ज़रिए इस feature की speed दो गुना से अधिक बेहतर हुई है, और इसके प्रमुख optimization तरीकों का विस्तार से परिचय दिया गया है
side-effect रहित Fast Path
- optimization का मुख्य बिंदु यह है कि side-effect न होने वाली स्थितियों में ही इस्तेमाल होने वाला तेज़ serialization path लागू किया गया
- ऐसी स्थितियों में object traversal recursion की जगह iterative structure से किया जाता है, जिससे stack overflow check की ज़रूरत नहीं पड़ती और अधिक गहरे objects को serialize करना भी संभव होता है
- जब data object सरल होता है, तो V8 धीमे सामान्य logic की जगह इस Fast Path का उपयोग करके कई checks छोड़ देता है और speed बढ़ाता है
विभिन्न string representations का प्रबंधन
- V8 1-byte/2-byte characters (ASCII/non-ASCII) के आधार पर strings को अलग तरीके से store करता है, और यदि एक भी non-ASCII character हो तो पूरी string को 2-byte रूप में संभाला जाता है
- string serialization performance के लिए हर string type के लिए अलग algorithm version compile किया जाता है
- processing के दौरान string instance type की जाँच करनी होती है, इसलिए यदि 2-byte string मिलती है तो उपयुक्त 2-byte serializer state को संभाल लेता है
- इसकी वजह से string encoding के अनुसार path switch करने का overhead लगभग नहीं के बराबर है
- परिणाम के लिए 1-byte और 2-byte buffers अलग-अलग बनाए जाते हैं और अंत में बस उन्हें merge कर दिया जाता है
SIMD से string serialization optimization
- JavaScript strings में ऐसे characters हो सकते हैं जिन्हें JSON serialization के समय escape करना पड़ता है
- लंबी strings को SIMD hardware instructions (जैसे ARM64 Neon) से एक बार में कई bytes जाँचकर process किया जाता है
- छोटी strings के लिए SWAR तरीका इस्तेमाल होता है, जिसमें general-purpose registers में bit operations के ज़रिए कई characters को एक साथ process किया जाता है
- किसी भी तरीके में, ज़्यादातर मामलों में बिना अतिरिक्त बदलाव के पूरी string को तेज़ी से copy किया जा सकता है
Express Lane जोड़ा गया
- Fast Path के भीतर भी property checks जैसी बार-बार होने वाली प्रक्रियाओं के बिना केवल keys copy करके serialization संभव बनाने के लिए Express Lane जोड़ा गया
- object के hidden class flag का उपयोग करके, यदि keys में Symbol न हो, वे सभी enumerable हों, और उन्हें escape की ज़रूरत न हो, तो उसे 'fast-json-iterable' के रूप में mark किया जाता है
- उसी hidden class वाले दूसरे object को serialize करते समय अलग से checks किए बिना सीधे key copy की जाती है
- इस तकनीक का उपयोग
JSON.parse में भी तेज़ key comparison के लिए किया गया है
तेज़ double-to-string algorithm
- numbers को strings में बदलने की प्रक्रिया भी उच्च आवृत्ति और जटिलता वाली होती है
- मौजूदा Grisu3 algorithm को Dragonbox से बदलने पर
Number.prototype.toString() की कुल calls में भी performance improvement मिला
temporary buffer structure optimization
- string build करते समय पहले एक single contiguous buffer इस्तेमाल होता था, जिसमें space कम पड़ने पर हर बार पूरा data copy करने का overhead आता था
- नया तरीका segmented buffer structure अपनाता है, जिसमें ज़रूरत के अनुसार कई छोटे buffers को जोड़ा जाता है
- इससे space कम पड़ने पर पूरा data copy किए बिना सिर्फ नया buffer allocate करना पड़ता है
सीमाएँ
- Fast Path केवल सरल data serialization पर लागू होता है
- नीचे दी गई शर्तें पूरी न होने पर सामान्य path इस्तेमाल होता है
- replacer या space argument का उपयोग नहीं होना चाहिए (Pretty-Print या transformation नहीं)
- object एक सरल object होना चाहिए, जिसमें custom toJSON method न हो
- index-based properties होने पर यह slow path पर चला जाता है
- ConsString जैसे special strings को यह process नहीं करता
- अधिकांश data serialization, API response generation, configuration caching जैसे सामान्य उपयोगों में optimization का लाभ अपने-आप लागू हो जाता है
निष्कर्ष
JSON.stringify की मूल design से लेकर memory handling और character processing तक पूरे क्षेत्र में approach को फिर से बनाकर JetStream2 benchmark के आधार पर 2x से अधिक speedup हासिल किया गया
- यह सुधार V8 version 13.8 (Chrome 138) या उसके बाद में तुरंत अनुभव किया जा सकता है
अभी कोई टिप्पणी नहीं है.