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

Google Sheets یکی از اولین محصولات گوگل است که از WasmGC در کروم استفاده می کند. این حرکت در سال 2022 اعلام شد و تیم‌های Sheets و Chrome در زمینه استانداردسازی، مهندسی و ابزارسازی برای ارائه بازخورد بلادرنگ درباره بهینه‌سازی‌ها شریک شدند. این مشارکت سابقه‌ای برای نحوه کار تیم‌های مهندسی در Google با Chrome ایجاد کرد تا برنامه‌های Google بیشتری در WasmGC اجرا شوند.

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

موتور محاسبات Google Sheets در اصل به زبان جاوا نوشته شده بود و در سال 2006 راه اندازی شد. در روزهای اولیه تولید، تمام محاسبات روی سرور انجام می شد. با این حال، از سال 2013، این موتور در مرورگر با استفاده از جاوا اسکریپت اجرا شده است. این کار در ابتدا از طریق Google Web Toolkit ( GWT ) و بعداً از طریق جاوا به Close JavaScript transpiler ( J2CL ) انجام شد. موتور محاسبات جاوا اسکریپت در یک Web Worker اجرا می شود و با استفاده از یک MessageChannel با رشته اصلی ارتباط برقرار می کند.

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

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

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

راه حل: WasmGC

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

Google Workspace با Chrome شریک است

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

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

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

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

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

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

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

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

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

نتیجه نهایی

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

نتیجه

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

سپاسگزاریها

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