Google Sheets ने अपने कैलकुलेशन वर्कर को JavaScript से WasmGC में क्यों पोर्ट किया

Google Sheets, Google के उन पहले प्रॉडक्ट में से एक है जो Chrome पर WasmGC का इस्तेमाल करते हैं. इस बदलाव के बारे में 2022 में बताया गया था. साथ ही, Sheets और Chrome की टीमों ने मिलकर, स्टैंडर्ड तय करने, इंजीनियरिंग करने, और टूल बनाने के लिए काम किया. इससे ऑप्टिमाइज़ेशन के बारे में रीयल-टाइम में सुझाव दिए जा सकते हैं. इस साझेदारी से, Google की इंजीनियरिंग टीमों को यह पता चला कि Chrome के साथ मिलकर कैसे काम किया जा सकता है, ताकि ज़्यादा से ज़्यादा Google ऐप्लिकेशन WasmGC पर चल सकें.

चैलेंज: JavaScript

Google Sheets के कैलकुलेशन इंजन को मूल रूप से Java में लिखा गया था और इसे 2006 में लॉन्च किया गया था. प्रॉडक्ट के शुरुआती दिनों में, सभी कैलकुलेशन सर्वर पर होती थी. हालांकि, 2013 से यह इंजन, JavaScript का इस्तेमाल करके ब्राउज़र में काम कर रहा है. पहले यह काम, Google Web Toolkit (GWT) की मदद से किया जाता था. बाद में, इसे Java to Closure JavaScript transpiler (J2CL) की मदद से किया जाने लगा. JavaScript कैलकुलेशन इंजन, वेब वर्कर में काम करता है. साथ ही, MessageChannel का इस्तेमाल करके मुख्य थ्रेड से कम्यूनिकेट करता है.

उपयोगकर्ताओं को सर्वर से कैलकुलेशन इंजन के JavaScript वर्शन पर माइग्रेट करना (और बाद में GWT से J2CL पर माइग्रेट करना) एक मुश्किल काम था. इसके लिए, सावधानी से पुष्टि करने की ज़रूरत थी. Sheets की टीम ने एक इंटरनल पुष्टि करने वाला सिस्टम बनाया है. इससे यह पक्का किया जा सकता है कि JavaScript कैलकुलेशन इंजन, Java वर्शन के जैसे ही सटीक नतीजे दे रहा है. यह सिस्टम, बड़ी संख्या में मौजूद शीट को प्रोसेस कर सकता है. साथ ही, यह पुष्टि कर सकता है कि कैलकुलेशन इंजन के अलग-अलग वर्शन में नतीजे एक जैसे हैं. Sheets की टीम, इस टूल का इस्तेमाल नियमित तौर पर करती है. इससे Sheets में किए गए बदलावों की पुष्टि की जाती है. हालांकि, टीम ने सिर्फ़ उन कैलकुलेशन के नतीजों की तुलना नहीं की. उन्होंने क्लाइंट पर JavaScript और सर्वर पर Java की परफ़ॉर्मेंस की तुलना भी की. उन्हें पता चला कि कैलकुलेशन इंजन का JavaScript वर्शन, Java वर्शन से तीन गुना ज़्यादा धीमा था.

JavaScript, Java से ज़्यादा धीमी क्यों है?

JavaScript, डाइनैमिक भाषा है. इसलिए, यह तेज़ी से काम करती है. पिछले 15 सालों में, जस्ट-इन-टाइम (JIT) कंपाइलर (जैसे, Maglev, Sparkplug, और Turbofan) में भारी निवेश किया गया है. इससे JavaScript की परफ़ॉर्मेंस बेहतर हुई है. हालांकि, JavaScript के लूज़ टाइप और डाइनैमिक व्यवहार की वजह से, JIT कंपाइलर के लिए सबसे अच्छा कोड जनरेट करना मुश्किल हो जाता है. इसका मतलब है कि रॉ थ्रूपुट के मामले में, JavaScript अब भी Java और C++ जैसी भाषाओं से पीछे है. TypeScript, JavaScript में टाइप की सुरक्षा जोड़ता है. हालांकि, टाइप की यह जानकारी डेवलपमेंट को आसान बनाने के लिए डिज़ाइन की गई है. इसका मकसद, कंपाइलर को इस तरह की गारंटी देना नहीं है कि वे सबसे सही कोड जनरेट कर सकें. Google Sheets जैसे मामलों में, बड़ी स्प्रेडशीट को कैलकुलेट करने में कुछ सेकंड लग सकते हैं. JavaScript तेज़ी से काम करती है, लेकिन इतनी तेज़ी से नहीं.

समस्या का हल: WasmGC

WasmGC, मौजूदा WebAssembly स्पेसिफ़िकेशन का एक एक्सटेंशन है. यह उन प्रिमिटिव को जोड़ता है जिनकी ज़रूरत गार्बेज कलेक्शन वाली भाषाओं (जैसे कि Java) को कंपाइल करने के लिए होती है. उदाहरण के लिए, WasmGC, टाइप तय करने और कचरा इकट्ठा करने वाले डेटा स्ट्रक्चर को असाइन करने के लिए निर्देश जोड़ता है. WasmGC, गार्बेज कलेक्शन वाली भाषाओं के लिए वही काम करेगा जो Wasm ने C++ के लिए किया था. जैसे, Photoshop या Google Earth. इसका मतलब है कि WasmGC, इन भाषाओं को वेब पर नेटिव स्पीड के करीब लाएगा. Google का मानना है कि WasmGC, Wasm से ज़्यादा असरदार हो सकता है. इसकी वजह यह है कि गार्बेज कलेक्शन की सुविधा वाली भाषाएं ज़्यादा लोकप्रिय हैं.

Google Workspace और Chrome के बीच साझेदारी

WasmGC MVP का ड्राफ़्ट स्पेसिफ़िकेशन 2019 में पब्लिश किया गया था. साल 2020 के आखिर में, Google Workspace और Chrome ने Sheets के कैलकुलेशन इंजन का इस्तेमाल करके WasmGC का आकलन करने के लिए साझेदारी की. Workspace की मल्टीप्लैटफ़ॉर्म टीम को कंपाइलर और ट्रांसपाइलर बनाने और उन्हें ऑप्टिमाइज़ करने का काफ़ी अनुभव है. Workspace का हिस्सा होने के नाते, Sheets को WasmGC का आकलन करने के लिए सबसे सही माना गया. यह परफ़ॉर्मेंस के हिसाब से संवेदनशील है. साथ ही, इसमें परफ़ॉर्मेंस और सही होने की पुष्टि करने के मज़बूत तरीके हैं. Chrome में V8 टीम है. यह WasmGC रनटाइम को बनाने और उसे ऑप्टिमाइज़ करने का काम करती है. साथ ही, इसमें Binaryen के योगदानकर्ता भी शामिल हैं. ये पहले से ही ऑप्टिमाइज़ किए गए कोड (एओटी) को बनाने का काम करते हैं. Chrome और Workspace, दोनों में WasmGC टूलचेन को बनाने और उसे ऑप्टिमाइज़ करने के लिए ज़रूरी विशेषज्ञता मौजूद है. साथ ही, Google Sheets को टेस्टबेड के तौर पर इस्तेमाल किया जा सकता है.

पहला प्रोटोटाइप

साल 2021 के मध्य तक, टीमों के पास काम करने वाला Java से WasmGC कंपाइलर था. उसी साल के आखिर तक, उनके पास Google Sheets का प्रोटोटाइप वर्शन था. यह WasmGC के तौर पर काम कर रहा था और कैलकुलेशन कर रहा था. इस दौरान, उन्हें कई चुनौतियों का सामना करना पड़ता है. प्रोफ़ाइलिंग और हीप डंप लेने के लिए टूलिंग मौजूद नहीं थी और इसे बनाना पड़ा. मौजूदा कोड में कई JavaScript लाइब्रेरी का इस्तेमाल किया गया था. इसलिए, WasmGC के लिए उनके विकल्प ढूंढने या उन्हें फिर से लिखना पड़ा. Wasm कैलकुलेशन इंजन के सही होने की पुष्टि करने में काफ़ी समय लगा. इसकी वजह यह है कि स्पेसिफ़िकेशन, कंपाइलर, और नई लाइब्रेरी एक्सपेरिमेंट के तौर पर उपलब्ध हैं. हालांकि, Sheets की पुष्टि करने की सुविधा एक बार फिर बहुत मददगार साबित हुई. आखिरकार, टीमों ने इसे ठीक कर दिया और परफ़ॉर्मेंस डेटा 2022 की शुरुआत में दिखने लगा.

अन्य ऑप्टिमाइज़ेशन

Sheets Wasm के शुरुआती वर्शन में, JavaScript के मुकाबले कैलकुलेशन की परफ़ॉर्मेंस करीब दो गुना धीमी थी. हालांकि, नए स्पेसिफ़िकेशन, नए कंपाइलर, और कई नई लाइब्रेरी के लिए यह बुरा नतीजा नहीं है. इसके बाद, Sheets टीम ने ऑप्टिमाइज़ेशन शुरू किया. उन्हें जो ऑप्टिमाइज़ेशन मिले उनमें से कुछ कैटगरी ये हैं:

  • उन मुख्य ऑप्टिमाइज़ेशन को दोहराना जो पहले से ही Java Virtual Machine (JVM) और V8 में मौजूद थे.
  • बेहतर तरीके से ऑप्टिमाइज़ किए गए ब्राउज़र एपीआई का इस्तेमाल करना.
  • JavaScript के लिए खास कोडिंग पैटर्न हटाना.

सबसे पहले, Sheets टीम को उन ऑप्टिमाइज़ेशन को दोहराना पड़ा जो पहले से ही अन्य टूलचेन में मौजूद हैं. इसका सबसे अच्छा उदाहरण, वर्चुअल मेथड डिस्पैचिंग को ऑप्टिमाइज़ करना है. इसे JVM और V8 ने लंबे समय से ऑप्टिमाइज़ किया है. हालांकि, WasmGC के लिए ऐसा कुछ भी मौजूद नहीं था. स्पेकुलेटिव इनलाइनिंग और डिवर्चुअलाइज़ेशन को लागू करने से, Chrome में कैलकुलेशन का समय करीब 40% कम हो गया. ये दोनों ऑप्टिमाइज़ेशन, बहुत आम हैं.

दूसरा, ऐसे मामले भी हैं जहां ब्राउज़र एपीआई को ऑप्टिमाइज़ किए गए नेटिव इंप्लीमेंटेशन से मदद मिलती है. Wasm का इस्तेमाल करके, इनका मुकाबला करना मुश्किल होता है. स्ट्रिंग और रेगुलर एक्सप्रेशन, इसके दो अच्छे उदाहरण हैं. खास तौर पर, रेगुलर एक्सप्रेशन के साथ काम करने वाली टीम ने देखा कि Chrome में re2j (WasmGC में कंपाइल किया गया) से RegExp ब्राउज़र एपीआई पर स्विच करने पर, रेगुलर एक्सप्रेशन के ऑपरेशन की स्पीड में करीब 100 गुना की बढ़ोतरी हुई. यह ब्राउज़र एपीआई, हर रेगुलर एक्सप्रेशन को उसके मशीन कोड में कंपाइल कर सकता है.

आखिर में, उन्हें पता चला कि कई सालों तक ऑप्टिमाइज़ेशन करने की वजह से, कोडबेस JavaScript के लिए बहुत ज़्यादा फ़िट हो गया था. उदाहरण के लिए, उनके पास Sheets में एक कोर डेटा स्ट्रक्चर था, जो ऐरे और मैप के बीच की लाइनों को धुंधला कर रहा था. JavaScript में यह तरीका ज़्यादा असरदार होता है. यह अपने-आप स्पार्स ऐरे को मैप के तौर पर मॉडल करता है. हालांकि, अन्य प्लैटफ़ॉर्म पर यह तरीका धीमा होता है. इसलिए, उन्हें कोड को ऐसे तरीके से फिर से लिखना पड़ा जो किसी भी प्लैटफ़ॉर्म पर काम कर सके. टीम को WebAssembly की यह सुविधा भी पसंद है: इससे मल्टीप्लैटफ़ॉर्म ऐप्लिकेशन को वेब पर अच्छी परफ़ॉर्मेंस पाने में आसानी होती है. आपको JavaScript की ख़ासियतों के हिसाब से, अपने पूरे ऐप्लिकेशन को बदलने की ज़रूरत नहीं है.

आखिरी नतीजा

इन सभी ऑप्टिमाइज़ेशन के बाद, Sheets के WasmGC वर्शन की कैलकुलेशन परफ़ॉर्मेंस, JavaScript की तुलना में करीब दो गुना तेज़ हो जाती है. यह शुरुआती WasmGC वर्शन की तुलना में चार गुना बेहतर है.

नतीजा

WasmGC एक बेहतरीन टेक्नोलॉजी है. इससे डेवलपर को वेब ऐप्लिकेशन बनाने के नए तरीके मिलते हैं. आने वाले सालों में, Google को उम्मीद है कि WasmGC, शेयर की गई मेमोरी मल्टीथ्रेडिंग की सुविधा के साथ काम करेगा. साथ ही, सिंगल थ्रेड की परफ़ॉर्मेंस को और बेहतर बनाएगा. हम सभी वेब डेवलपर को सलाह देते हैं कि वे अपने अगले हाई-परफ़ॉर्मेंस प्रोजेक्ट के लिए, WasmGC का इस्तेमाल करें. हमारे साथ जुड़ें और वेब को ज़्यादा तेज़ और बेहतर बनाएं!

Acknowledgements

WasmGC को लागू करने और इस केस स्टडी पर काम करने वाले लोगों को धन्यवाद: दिवाश अधिकारी, मैथ्यू एलब्राइट, क्सेनिया बुकिना, जूलियन ड्रामैक्स, आसिम फ़ज़ल, माइकल फ़्रेडरिक, गोकटुग गोकडोगन, जेनिस गु, ऐडम क्लेन, मैनोस कुकुटोस, जेकब कुमेरोव, मैथियास लीड्टके, थॉमस लाइवली, रॉबर्टो लुब्लिनरमैन, विश्रुत मेहता, थॉमस नैटेस्टैड, जोश पर्लस्टीन, जोआकिम पेरोटी, क्रिस रुएनेस, स्टीवन सैवियानो, डेरेक शफ़, टिम सीयर्स, माइकल थॉमस, युआन तियान, फ़िलिप वेइस, मेसन वू, एलन ज़काई, और इमैनुअल ज़िगलर.