𝗜 𝗥𝗲𝗽𝗹𝗮𝗰𝗲𝗱 𝗝𝗦𝗢𝗡 𝗪𝗶𝘁𝗵 𝗔 𝗖𝘂𝘀𝘁𝗼𝗺 𝗕𝗶𝗻𝗮𝗿𝘆 𝗙𝗼𝗿𝗺𝗮𝘁 𝗜𝗻 𝗣𝗛𝗣
आमच्या ॲप्स आणि वेबसाइट्ससाठी रिच टेक्स्ट (rich text) साठवण्यासाठी आम्हाला एका चांगल्या पद्धतीची गरज होती.
सुरुवातीला, आम्ही आमच्या डेटाबेसमध्ये रॉ HTML (raw HTML) साठवत होतो. नंतर, एडिटिंग आणि प्रिंटिंग वेगळे करण्यासाठी आम्ही JSON कडे वळलो. काही काळ JSON ने काम केले, पण जसा आमचा विस्तार झाला, तसे त्याने नवीन समस्या निर्माण केल्या.
आमच्या गरजांसाठी JSON खूप संथ (slow) झाले होते.
जेव्हा आम्हाला जुन्या लिंक्स शोधण्याची आणि अपडेट करण्याची गरज पडली, तेव्हा आम्हाला संपूर्ण ॲरे (arrays) पार्स (parse) करावे लागत आणि पुन्हा तयार करावे लागत. ही प्रक्रिया संथ आणि अकार्यक्षम होती. आम्हाला अशा फॉरमॅटची गरज होती जो जलद डेटा मॅनिप्युलेशन (data manipulation) आणि स्ट्रीमिंगला (streaming) परवानगी देईल.
मी PHP वापरून एक कस्टम बायनरी फॉरमॅट तयार करण्याचा निर्णय घेतला.
अनेक डेव्हलपर्सना असे वाटते की PHP लो-लेव्हल बाइट मॅनेजमेंटसाठी (low-level byte management) बनवलेले नाही. मात्र, PHP मध्ये यासाठी इन-बिल्ट फंक्शन्स आहेत:
pack(): संख्या किंवा स्ट्रिंग्सना रॉ बाइट्समध्ये (raw bytes) रूपांतरित करते.unpack(): त्या बाइट्सना पुन्हा संख्या किंवा स्ट्रिंग्समध्ये रूपांतरित करते.
मी मल्टीबाइट स्ट्रिंग ऑपरेशन्स (multibyte string operations) वापरणे थांबवले. त्याऐवजी, मी बाइट्सचे विशिष्ट चंक्स (chunks) वाचण्यावर लक्ष केंद्रित केले. उदाहरणार्थ, एका अनसाईन्ड 64-बिट इंटीजरला (unsigned 64-bit integer) नेमके 8 बाइट्स लागतात. बायनरी डेटावर काम करताना अचूकता (precision) अत्यंत महत्त्वाची असते.
मी डेटाची रचना (structure) करण्याची पद्धत देखील बदलली.
बहुतेक लोक डॉक्युमेंट्सना खोल, नेस्टेड ट्री स्ट्रक्चरमध्ये (deep, nested tree structure) ठेवण्याचा प्रयत्न करतात. ही अनेकदा एक चूक असते. मी टेक्स्ट, टॅग्स आणि लिस्ट यांसारख्या एलिमेंट्सच्या फ्लॅट लिस्टमध्ये (flat list) बदल केला. HTML पुन्हा तयार करण्यासाठी मी ऑफसेट्सच्या (offsets) एका साध्या ट्रीचा वापर करतो. यामुळे सर्व लिंक्स शोधणे किंवा HTML स्ट्रिप करणे यांसारखी कामे खूप जलद होतात.
१०,००० लूप्सच्या निकालांवरून एक स्पष्ट विजेता समोर येतो:
जुने JSON एन्कोडिंग: 2.18s जुने JSON डिकोडिंग: 0.86s
नवीन बायनरी एन्कोडिंग: 1.19s नवीन बायनरी डिकोडिंग: 0.67s
नवीन फॉरमॅट एन्कोडिंग आणि डिकोडिंग दोन्हीसाठी अधिक वेगवान आहे.
बायनरी फॉरमॅट JSON किंवा HTML पेक्षा मोठा आहे. तो JSON च्या तुलनेत साधारण दुप्पट जागा घेतो. आम्ही सर्व्हर-साइड रेंडरिंग (server-side rendering) वापरत असल्यामुळे, स्टोरेजमधील या वाढीचा आमच्या परफॉर्मन्सवर परिणाम होत नाही.
हा बदल फायदेशीर ठरला आहे. आता आम्ही साध्या आणि जलद फंक्शन्सद्वारे लिंक्स बदलू शकतो आणि HTML स्वच्छ (clean up) करू शकतो.
जर तुम्ही एखादा कस्टम फॉरमॅट तयार करत असाल, तर त्याचे स्पष्ट स्पेसिफिकेशन (specification) लिहा. नंतर जेव्हा तुम्ही पुन्हा कोडकडे पाहाल, तेव्हा तुम्हाला त्याची गरज पडेल.
स्रोत: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok