Google Sheets הוא אחד מהמוצרים הראשונים של Google שמשתמשים ב-WasmGC ב-Chrome. ההעברה הזו הוכרזה ב-2022, וצוותים של Sheets ו-Chrome שיתפו פעולה בנושאי סטנדרטיזציה, הנדסה וכלים כדי לספק משוב בזמן אמת על אופטימיזציות. השותפות הזו היא תקדים לדרך שבה צוותי ההנדסה ב-Google יכולים לעבוד ביעילות עם Chrome כדי להגדיל את מספר האפליקציות של Google שפועלות ב-WasmGC.
האתגר: JavaScript
מנוע החישוב של Google Sheets נכתב במקור ב-Java והושק בשנת 2006. בימים הראשונים של המוצר, כל החישובים התבצעו בשרת. עם זאת, החל משנת 2013, המנוע פועל בדפדפן באמצעות JavaScript. בהתחלה, הדבר נעשה באמצעות Google Web Toolkit (GWT), ולאחר מכן באמצעות transpiler של Java ל-Closure JavaScript (J2CL). מנוע החישוב של JavaScript פועל ב-Web Worker ומשתמש ב-MessageChannel
כדי לתקשר עם השרשור הראשי.
העברת המשתמשים מהשרת לגרסה של JavaScript למנוע החישוב (ומאוחר יותר מ-GWT ל-J2CL) הייתה משימה גדולה שדרשה אימות יסודי. כדי לוודא שמנוע החישובים של JavaScript מניב את אותן תוצאות בדיוק כמו גרסת Java, צוות Sheets פיתח מנגנון אימות פנימי. המנגנון הזה יכול לעבד מאגר גדול של גיליונות ולבדוק שהתוצאות זהות במספר גרסאות של מנוע החישוב. צוות Sheets משתמש בכלי הזה באופן קבוע כדי לאמת שינויים ב-Sheets. אבל הצוות לא השווה רק את התוצאות של החישובים האלה, אלא גם את הביצועים בין JavaScript בצד הלקוח לבין Java בשרת. הם גילו שגרסת JavaScript של מנוע החישוב איטית פי יותר משלוש מגרסת Java.
למה JavaScript איטית יותר מ-Java?
JavaScript היא שפה דינמית עם סיווג רופף, והיא מהירה. השקעה כבדה במהדרים מסוג JIT (Just In Time) (לדוגמה, Maglev, Sparkplug ו-Turbofan) במהלך 15 השנים האחרונות הובילה לשיפור בביצועים של JavaScript. עם זאת, הסוגים הרופפים וההתנהגות הדינמית של JavaScript מקשים על מהדרי JIT ליצור קוד אופטימלי. כלומר, JavaScript עדיין נמצאת מאחורי שפות כמו Java ו-C++ מבחינת תפוקת נתונים גולמית. TypeScript מוסיף ל-JavaScript אבטחת סוגים, אבל פרטי הסוגים האלה נועדו להקל על הפיתוח, ולא לספק את סוגי הערבויות שנדרשות למהדרים כדי ליצור קוד אופטימלי. במקרים כמו Google Sheets, שבהם חישוב של גיליונות אלקטרוניים גדולים עשוי להימשך עשרות שניות, JavaScript מהיר, אבל לא מספיק מהיר.
הפתרון: WasmGC
WasmGC הוא תוסף למפרט הקיים של WebAssembly, שמוסיף את הרכיבים הבסיסיים הנדרשים כדי לקמפל שפות עם איסוף אשפה (כמו Java). לדוגמה, WasmGC מוסיף הוראות להגדרת סוגים והקצאה של מבני נתונים שנאספים על ידי האוסף האוטומטי של אשפה. WasmGC עומד לעשות בשביל שפות עם איסוף אשפה את מה ש-Wasm עשה בשביל C++ (לדוגמה, Photoshop או 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, הצוותים יצרו מַעְרִיכ Java ל-WasmGC שפועל. לקראת סוף אותה שנה, הם יצרו גרסת אב טיפוס של Google Sheets שפועלת כ-WasmGC ומבצעת חישובים. לאורך הדרך הם נתקלו באתגרים רבים. לא היו כלים ליצירת פרופילים וליצירת קבצים של יצירת גרסת דמפ של אשכול, ולכן נאלצנו לפתח אותם. ההטמעה הקיימת התבססה על ספריות JavaScript רבות, ועבור WasmGC נדרשו ספריות חלופיות או שצריך היה לכתוב אותן. תהליך האימות של תקינות מנוע החישוב של Wasm היה ממושך בגלל האופי הניסיוני של המפרט, המהדר והספריות החדשות. אבל מנגנוני האימות של Sheets עזרו לנו שוב מאוד. בסופו של דבר הצוותים הצליחו להפעיל את הכול, ונתוני הביצועים החלו להגיע בתחילת 2022.
אופטימיזציות נוספות
בגרסה הראשונית של Sheets Wasm, ביצועי החישובים היו איטיים פי שניים בערך בהשוואה ל-JavaScript. עם זאת, זו תוצאה לא רעה למפרט חדש, למהדר חדש ולכמה ספריות חדשות. מכאן ואילך, צוות Sheets התחיל לבצע אופטימיזציה. מתוך האופטימיזציות שהם מצאו, התגלו כמה קטגוריות:
- שכפול של אופטימיזציות ליבה שכבר היו קיימות במכונה הווירטואלית של Java (JVM) וב-V8.
- שימוש בממשקי API לדפדפנים שעברו אופטימיזציה רבה.
- הסרת דפוסי תכנות ספציפיים ל-JavaScript.
קודם כל, צוות Sheets היה צריך לשכפל אופטימיזציות שכבר קיימות בכלים אחרים. הדוגמה הטובה ביותר לכך היא אופטימיזציה של הקצאת שיטות וירטואליות, שבוצעה כבר מזמן על ידי JVM ו-V8, אבל לא הייתה קיימת ב-WasmGC. הטמעת הטמעה תוך כדי חישוב וביטול וירטואליזציה – שתי שיטות אופטימיזציה נפוצות מאוד – הובילה לקיצור זמן החישוב ב-Chrome בכ-40%.
שנית, יש מקרים שבהם ממשקי API של דפדפנים נתמכים בהטמעות מותאמות אופטימלית של קוד מקורי, שקשה להתחרות בהן באמצעות Wasm. מחרוזות וביטויים רגולריים הן שתי דוגמאות טובות. באופן ספציפי, בביטויים רגולריים, הצוות ראה שיפור של כמעט פי 100 במהירות הפעולות של הביטויים הרגולריים במעבר מ-re2j (שעבר הידור ל-WasmGC) לממשק ה-API של הדפדפן RegExp
ב-Chrome, שיכול להדר כל ביטוי רגולרי לקוד מכונה משלו.
לבסוף, הם גילו ששנים של אופטימיזציה גרמו לכך שקוד הבסיס מותאם יתר על המידה ל-JavaScript. לדוגמה, היה להם מבנה נתונים מרכזי ב-Sheets שהקשה להבחין בין מערכים למפות. הפתרון הזה יעיל ב-JavaScript, שבה מערכי מידע דלילים מוגדרים באופן אוטומטי כמפות, אבל הוא איטי בפלטפורמות אחרות. לכן הם נאלצו לכתוב מחדש את הקוד בצורה פחות תלוית-פלטפורמה. זהו עוד יתרון של WebAssembly בעיני הצוות: הוא מאפשר לאפליקציות לפלטפורמות מרובות להשיג ביצועים טובים יותר באינטרנט. אתם לא צריכים לשנות את כל האפליקציה בהתאם למאפיינים הייחודיים של JavaScript.
התוצאה הסופית
אחרי כל האופטימיזציות האלה, בגרסת WasmGC הסופית של Sheets הביצועים של החישובים הם כמעט פי שניים מהר יותר מאשר ב-JavaScript, ושיעור השיפור הוא פי ארבעה בהשוואה לנקודת ההתחלה של גרסת WasmGC הראשונית.
סיכום
WasmGC היא טכנולוגיה חזקה שיש לה פוטנציאל לשפר את האופן שבו מפתחים יוצרים אפליקציות אינטרנט. בשנים הקרובות, אנחנו ב-Google מקווים ש-WasmGC ישתפר כך שיתמוך בשימוש בכמה חוטים בזיכרון משותף וישפר את הביצועים של חוט יחיד. אנחנו ממליצים לכל מפתחי האינטרנט לשקול להשתמש ב-WasmGC בפרויקט הבא שלהם עם ביצועים גבוהים. הצטרפו אלינו ונעזור יחד להפוך את האינטרנט למקום מהיר וחלק יותר.
תודות
תודה לכל מי שעבד על הטמעת WasmGC ועל מחקר המקרה הזה: Diwas Adhikary, Matthew Albright, Ksenia Bukina, Julien Dramaix, Asim Fazal, Michael Frederick, Goktug Gokdogan, Janice Gu, Adam Klein, Manos Koukoutos, Jakob Kummerow, Matthias Liedtke, Thomas Lively, Roberto Lublinerman, Vishrut Mehta, Thomas Nattestad, Josh Pearlstein, Joaquim Perotti, Chris Ruenes, Steven Saviano, Derek Schuff, Tim Sears, Michael Thomas, Yuan Tian, Philipp Weis, Mason Wu, Alon Zakai ו- Emanuel Ziegler.