چرا Google Sheets کاربر محاسباتی خود را از جاوا اسکریپت به WasmGC منتقل کرد؟

گوگل شیتس یکی از اولین محصولات گوگل است که از WasmGC در کروم استفاده می‌کند. این اقدام در سال ۲۰۲۲ اعلام شد و تیم‌های گوگل شیتس و کروم در زمینه استانداردسازی، مهندسی و ابزارسازی برای ارائه بازخورد در لحظه در مورد بهینه‌سازی‌ها با یکدیگر همکاری کردند. این همکاری، سابقه‌ای را برای چگونگی همکاری مؤثر تیم‌های مهندسی در گوگل با کروم برای اجرای برنامه‌های گوگل بیشتر روی WasmGC ایجاد کرد.

چالش: جاوا اسکریپت

موتور محاسبه گوگل شیت در ابتدا با زبان جاوا نوشته شده و در سال ۲۰۰۶ عرضه شد. در روزهای اولیه این محصول، تمام محاسبات روی سرور انجام می‌شد. با این حال، از سال ۲۰۱۳، این موتور با استفاده از جاوا اسکریپت در مرورگر اجرا می‌شود. این کار در ابتدا از طریق جعبه ابزار وب گوگل ( GWT ) و بعداً از طریق جاوا به Closure JavaScript transpiler ( J2CL ) انجام می‌شد. موتور محاسبه جاوا اسکریپت در یک Web Worker اجرا می‌شود و با استفاده از MessageChannel با نخ اصلی ارتباط برقرار می‌کند.

مهاجرت کاربران از سرور به نسخه جاوا اسکریپت موتور محاسبه (و بعداً از GWT به J2CL) یک کار بزرگ بود که نیاز به اعتبارسنجی دقیق داشت. برای اطمینان از اینکه موتور محاسبه جاوا اسکریپت دقیقاً همان نتایج نسخه جاوا را تولید می‌کند، تیم Sheets یک مکانیسم اعتبارسنجی داخلی ایجاد کرد. این مکانیسم می‌تواند حجم زیادی از برگه‌ها را پردازش کند و تأیید کند که نتایج بین نسخه‌های مختلف موتور محاسبه یکسان هستند. تیم Sheets به طور منظم از این ابزار برای اعتبارسنجی تغییرات در Sheets استفاده می‌کند. اما این تیم فقط نتایج این محاسبات را مقایسه نکرد، بلکه عملکرد بین جاوا اسکریپت روی کلاینت و جاوا روی سرور را نیز مقایسه کرد. آنها دریافتند که نسخه جاوا اسکریپت موتور محاسبه بیش از سه برابر کندتر از نسخه جاوا است.

چرا جاوااسکریپت از جاوا کندتر است؟

جاوا اسکریپت به عنوان یک زبان پویا و با نوع‌بندی آزاد، سریع است. سرمایه‌گذاری سنگین روی کامپایلرهای JIT (مثل Maglev ، Sparkplug و Turbofan ) در ۱۵ سال گذشته، عملکرد جاوا اسکریپت را افزایش داده است. با این حال، نوع‌های آزاد و رفتار پویای جاوا اسکریپت، تولید کد بهینه را برای کامپایلرهای JIT چالش‌برانگیز می‌کند. این بدان معناست که جاوا اسکریپت هنوز از نظر توان عملیاتی خام از زبان‌هایی مانند جاوا و C++ عقب است. TypeScript ایمنی نوع را به جاوا اسکریپت اضافه می‌کند، اما این اطلاعات نوع برای آسان‌تر کردن توسعه طراحی شده است، نه برای ارائه انواع تضمین‌های مورد نیاز کامپایلرها برای تولید کد بهینه. برای مواردی مانند Google Sheets، که محاسبه صفحات گسترده بزرگ می‌تواند ده‌ها ثانیه طول بکشد، جاوا اسکریپت سریع است، اما نه به اندازه کافی سریع.

راه حل: WasmGC

WasmGC افزونه‌ای برای مشخصات موجود WebAssembly است که موارد اولیه مورد نیاز برای کامپایل زبان‌های garbage collector (مانند جاوا) را اضافه می‌کند. به عنوان مثال، WasmGC دستورالعمل‌هایی برای تعریف نوع‌ها و تخصیص ساختارهای داده garbage collector اضافه می‌کند. WasmGC آماده است تا همان کاری را که Wasm برای C++ (به عنوان مثال، فتوشاپ یا گوگل ارث ) انجام داد، برای زبان‌های garbage collector انجام دهد، یعنی آنها را با سرعتی تقریباً بومی به وب بیاورد. در گوگل، ما معتقدیم که WasmGC به دلیل محبوبیت زبان‌های garbage collector، پتانسیل تأثیرگذاری بیشتری نسبت به Wasm دارد.

همکاری گوگل ورک اسپیس با کروم

پیش‌نویس مشخصات MVP مربوط به WasmGC در سال ۲۰۱۹ منتشر شد. در اواخر سال ۲۰۲۰، گوگل ورک‌اسپیس و کروم برای ارزیابی WasmGC با استفاده از موتور محاسبه Sheets با یکدیگر همکاری کردند. تیم چند پلتفرمی Workspace تخصص قابل توجهی در ساخت و بهینه‌سازی کامپایلرها و ترانسپایلرها دارد. Sheets، که بخشی از Workspace است، به عنوان کاندیدای ایده‌آلی برای ارزیابی WasmGC شناسایی شد: این پلتفرم به عملکرد حساس است و مکانیسم‌های اعتبارسنجی عملکرد و صحت قوی دارد. کروم تیم V8 را برای ساخت و بهینه‌سازی زمان اجرای WasmGC و همچنین مشارکت‌کنندگان Binaryen را برای ساخت بهینه‌سازی‌های پیش از موعد (AOT) در اختیار دارد. بین کروم و ورک‌اسپیس، تمام تخصص لازم برای ساخت و بهینه‌سازی یک زنجیره ابزار WasmGC وجود دارد و Google Sheets به عنوان یک بستر آزمایشی ایده‌آل عمل می‌کند.

اولین نمونه اولیه

تا اواسط سال ۲۰۲۱، تیم‌ها یک کامپایلر جاوا به WasmGC داشتند که کار می‌کرد. در اواخر همان سال، آنها یک نسخه اولیه از Google Sheets داشتند که به عنوان WasmGC اجرا می‌شد و محاسبات را انجام می‌داد. در طول مسیر، آنها با چالش‌های زیادی روبرو شدند. ابزارهایی برای پروفایلینگ و گرفتن هیپ دامپ وجود نداشت و باید ساخته می‌شد. پیاده‌سازی موجود به بسیاری از کتابخانه‌های جاوا اسکریپت متکی بود که باید جایگزین‌هایی برای آنها پیدا می‌شد یا برای WasmGC نوشته می‌شد. اعتبارسنجی صحت موتور محاسبه Wasm به دلیل ماهیت آزمایشی مشخصات، کامپایلر و کتابخانه‌های جدید، کاری زمان‌بر بود. اما مکانیسم‌های اعتبارسنجی Sheets بار دیگر بسیار مفید بودند. تیم‌ها در نهایت همه چیز را به کار انداختند و داده‌های عملکرد از اوایل سال ۲۰۲۲ شروع به دریافت کردند.

بهینه‌سازی‌های اضافی

نسخه اولیه Sheets Wasm عملکرد محاسباتی تقریباً دو برابر کندتر از جاوا اسکریپت را نشان داد. با این حال، این نتیجه بدی برای مشخصات جدید، کامپایلر جدید و چندین کتابخانه جدید نیست. از این نقطه، تیم Sheets شروع به بهینه‌سازی کرد. از بهینه‌سازی‌هایی که آنها یافتند، چند دسته پدیدار شد:

  • تکرار بهینه‌سازی‌های اصلی که از قبل در ماشین مجازی جاوا (JVM) و در V8 وجود داشتند.
  • استفاده از API های مرورگر بسیار بهینه شده.
  • حذف الگوهای کدنویسی مخصوص جاوا اسکریپت.

اولاً، تیم Sheets نیاز داشت تا بهینه‌سازی‌هایی را که از قبل در سایر زنجیره‌های ابزار وجود دارد، تکرار کند. بهترین مثال برای این موضوع، بهینه‌سازی اعزام متد مجازی است که مدت‌هاست توسط JVM و V8 بهینه‌سازی شده است، اما هیچ چیزی برای WasmGC وجود نداشته است. پیاده‌سازی inline کردن حدسی و devirtualization - دو بهینه‌سازی بسیار رایج - زمان محاسبه را در Chrome تقریباً 40٪ افزایش داد.

دوم، مواردی وجود دارد که APIهای مرورگر توسط پیاده‌سازی‌های بومی بهینه‌شده پشتیبانی می‌شوند که رقابت با آنها با استفاده از Wasm دشوار است. رشته‌ها و عبارات منظم دو نمونه خوب هستند. به طور خاص، با عبارات منظم، تیم هنگام تغییر از re2j (کامپایل شده به WasmGC) به API مرورگر RegExp در Chrome، که می‌تواند هر عبارت منظم را به کد ماشین خود کامپایل کند، تقریباً ۱۰۰ برابر افزایش سرعت عملیات عبارات منظم را مشاهده کرد.

در نهایت، آنها دریافتند که سال‌ها بهینه‌سازی باعث شده است که کدبیس بیش از حد با جاوااسکریپت تطبیق داده شود. به عنوان مثال، آنها یک ساختار داده اصلی در Sheets داشتند که مرز بین آرایه‌ها و نقشه‌ها را محو می‌کرد. این در جاوااسکریپت کارآمد است، که به طور خودکار آرایه‌های پراکنده را به عنوان نقشه‌ها مدل‌سازی می‌کند، اما در پلتفرم‌های دیگر کند است. بنابراین آنها مجبور شدند کد را به روشی مستقل از پلتفرم بازنویسی کنند. این یکی دیگر از چیزهایی است که تیم در مورد WebAssembly دوست دارد: این امر باعث می‌شود برنامه‌های چند پلتفرمی بتوانند عملکرد خوبی در وب داشته باشند. لازم نیست کل برنامه خود را با ویژگی‌های خاص جاوااسکریپت تطبیق دهید.

نتیجه نهایی

پس از تمام این بهینه‌سازی‌ها، نسخه نهایی WasmGC از Sheets به عملکرد محاسباتی تقریباً دو برابر سریع‌تر از جاوا اسکریپت دست می‌یابد که نشان‌دهنده بهبود چهار برابری نسبت به نقطه شروع نسخه اولیه WasmGC است.

نتیجه‌گیری

WasmGC یک فناوری قدرتمند است که پتانسیل پیشرفت در نحوه ساخت برنامه‌های وب توسط توسعه‌دهندگان را دارد. در سال‌های آینده، در گوگل، امیدواریم شاهد پیشرفت WasmGC در پشتیبانی از چندرشته‌ای‌سازی حافظه مشترک و بهبود بیشتر عملکرد تک‌رشته‌ای باشیم. ما همه توسعه‌دهندگان وب را تشویق می‌کنیم که استفاده از WasmGC را برای پروژه بعدی با عملکرد بالای خود در نظر بگیرند. به ما بپیوندید و با هم وب را به مکانی سریع‌تر و روان‌تر تبدیل کنیم!

تقدیرنامه‌ها

با تشکر از کسانی که در پیاده‌سازی WasmGC و این مطالعه موردی کار کردند: دیواس آدیکاری، متیو آلبرایت، کسنیا بوکینا، جولین درامیکس، آسیم فاضل، مایکل فردریک، گوکتوگ گوکدوگان، جنیس گو، آدام کلاین، مانوس کوکوتوس، یاکوب کومرو، ماتیاس لیدکه، توماس لیولی، روبرتو لوبلینرمن، ویشروت مهتا، توماس ناتستاد، جاش پرلشتاین، خواکیم پروتی، کریس رونز، استیون ساویانو، درک شاف، تیم سیرز، مایکل توماس، یوان تیان، فیلیپ ویس، میسون وو، آلون زاکای و امانوئل زیگلر.