Google Sheets הוא אחד מהמוצרים הראשונים ב-Google שהשתמשו ב-WasmGC ב-Chrome. הכרזנו על המעבר בשנת 2022, וצוותים של Sheets ו-Chrome שיתפו פעולה בנושא של סטנדרטיזציה, הנדסה וכלים כדי לתת משוב בזמן אמת על אופטימיזציות. השותפות הזו יצרה תקדים לגבי האופן שבו צוותי הנדסה ב-Google יכולים לעבוד ביעילות עם Chrome כדי להפעיל יותר אפליקציות של Google ב-WasmGC.
האתגר: JavaScript
מנוע החישוב של Google Sheets נכתב במקור ב-Java והושק ב-2006. בימים המוקדמים של המוצר, כל החישובים בוצעו בשרת. עם זאת, החל מ-2013, המנוע פעל בדפדפן באמצעות JavaScript. הדבר בוצע במקור באמצעות כלי האינטרנט של Google (GWT), ולאחר מכן באמצעות טרנספילר JavaScript מ-Java ל-Closure JavaScript (J2CL). מנוע החישוב של JavaScript פועל ב-Web Worker ומתקשר עם ה-thread הראשי באמצעות MessageChannel
.
העברת המשתמשים מהשרת לגרסת ה-JavaScript של מנגנון החישוב (ומאוחר יותר מ-GWT ל-J2CL) הייתה פעולה משמעותית שדרשה אימות קפדני. כדי להבטיח שמנוע החישוב של JavaScript הניב בדיוק את אותן התוצאות שמתקבלות בגרסת Java, צוות Sheets פיתח מנגנון אימות פנימי. מנגנון זה יכול לעבד אוסף גדול של גיליונות ולוודא שהתוצאות זהות בין גרסאות מרובות של מנוע החישוב. הצוות של Sheets משתמש בכלי הזה באופן קבוע כדי לאמת שינויים ב-Sheets. אבל הצוות לא רק משווה את התוצאות של החישובים האלה, הוא גם משווה את הביצועים בין JavaScript בצד הלקוח לבין Java בשרת. הם גילו שגרסת ה-JavaScript של מנוע החישוב הייתה איטית יותר פי שלושה מגרסת Java.
למה JavaScript איטי יותר מ-Java?
JavaScript הוא שירות מהיר לשפה דינמית בהקלדה חלש. ב-15 השנים האחרונות, השקעה גבוהה במהדרים בדיוק בזמן (JIT) (לדוגמה Maglev, Sparkplug ו-Turbofan) הובילה לשיפור הביצועים של JavaScript. עם זאת, הסוגים החופשיים של ה-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
מפרט טיוטת ה-MVP של WasmGC פורסם בשנת 2019. בסוף שנת 2020, Google Workspace ו-Chrome עבדו בשיתוף כדי לבדוק את WasmGC באמצעות מנוע החישוב של Sheets. לצוות מרובה הפלטפורמות של Workspace יש מומחיות גבוהה בבנייה ובאופטימיזציה של מהדרים וטרנספורמרים. Sheets, שהוא חלק מ-Workspace, זוהה כמועמד אידיאלי להערכה של WasmGC: הוא רגיש לביצועים, ויש לו מנגנונים עוצמתיים לאימות ביצועים ותקינות. ב-Chrome יש צוות V8 שתפקידו ליצור ולבצע אופטימיזציה של זמן הריצה של WasmGC, וגם את השותפים ל-Binaryen כדי ליצור אופטימיזציות מראש (AOT). בין Chrome ל-Workspace, אנחנו מציעים את כל המומחיות הדרושה כדי ליצור ולבצע אופטימיזציה של 'צרור כלים של WasmGC', כאשר Google Sheets משמש כקבוצת בדיקות אידיאלית.
אב הטיפוס הראשון
עד אמצע 2021, לצוותים היה מהדר (compiler) Java ל-WasmGC פעיל. לקראת סוף אותה שנה, הם השתמשו בגרסת אב-טיפוס של Google Sheets שפועלת כ-WasmGC וביצעו חישובים. בדרך הם עמדו באתגרים רבים. לא היו כלים ליצירת פרופילים וליצירת תמונת מצב של הזיכרון, והיה צורך לבנות אותם. ההטמעה הקיימת הסתמכה על ספריות רבות של JavaScript שעבורן היה צורך למצוא או לכתוב חלופות ל-WasmGC. אימות הדיוק של מנגנון החישוב של Wasm היה ארוך מדי, בגלל האופי הניסיוני של המפרט, המהדר (compiler) וספריות חדשות. עם זאת, מנגנוני האימות של Sheets שוב היו שימושיים מאוד. בסופו של דבר, הצוותים עבדו, ונתוני הביצועים התחילו להגיע בתחילת 2022.
אופטימיזציות נוספות
הגרסה הראשונית של Sheets Wasm הציגה את ביצועי החישוב פי שניים בערך איטי יותר מאשר ב-JavaScript. עם זאת, זו לא תוצאה רעה עבור מפרט חדש, מהדר חדש ומספר ספריות חדשות. בשלב הזה, צוות Sheets התחיל לבצע אופטימיזציה. מבין האופטימיזציה שהם מצאו, נמצאו מספר קטגוריות:
- שכפול של אופטימיזציות ליבה שכבר קיימות במכונה הווירטואלית של Java (JVM) וב-V8.
- שימוש בממשקי API לדפדפנים שעברו אופטימיזציה.
- הסרה של דפוסי קידוד ספציפיים ל-JavaScript.
קודם כל, צוות Sheets היה צריך לשכפל אופטימיזציות שכבר קיימות בצרורות כלים אחרות. הדוגמה הטובה ביותר לכך היא אופטימיזציה של שליחת שיטות וירטואליות, שכבר עברה אופטימיזציה על ידי ה-JVM ו-V8, אבל לא היה שום דבר קיים לגבי WasmGC. השימוש בהתווספות ספקולטיביות ובדוורציה – שתי אופטימיזציות נפוצות מאוד – האיצה את זמן החישוב בכ-40% ב-Chrome.
שנית, יש מקרים שבהם ממשקי API של דפדפנים מגובים בהטמעות נייטיב שעברו אופטימיזציה וקשה להתחרות בהן באמצעות Wasm. מחרוזות וביטויים רגולריים הם שתי דוגמאות טובות. באופן ספציפי, בעזרת ביטויים רגולריים, הצוות נהנה מהאצה של פעולות של ביטויים רגולריים כמעט פי 100 במהלך המעבר מ-re2j (מחודש ל-WasmGC) ל-API של RegExp
לדפדפן ב-Chrome, שיכול להרכיב כל ביטוי רגולרי לקוד מכונה משלו.
לבסוף, הם גילו ששנים של אופטימיזציה גרמו להתאמה יתר של ה-codebase ל-JavaScript. לדוגמה, ב-Sheets היה מבנה נתונים מרכזי שטשטש את הקווים בין מערכים למפות. זו שיטה יעילה ב-JavaScript, שיוצרת באופן אוטומטי מודלים של מערכים מעטים כמפות, אבל איטית בפלטפורמות אחרות. לכן הם היו צריכים לשכתב את הקוד בדרך שלא תלוית יותר בפלטפורמה. זה דבר נוסף שהצוות אוהב ב-WebAssembly: הוא מקל על אפליקציות במגוון פלטפורמות להשיג ביצועים טובים באינטרנט. אתם לא צריכים לכופף את כל האפליקציה שלכם לשימושיות האידאוסינכרוניות של JavaScript.
התוצאה הסופית
לאחר כל האופטימיזציות האלה, גרסת WasmGC הסופית של Sheets תשיג ביצועי חישוב פי שניים בערך כמו JavaScript. הביצועים האלה מייצגים שיפור של פי ארבעה יותר מנקודת ההתחלה של הגרסה הראשונית של WasmGC.
סיכום
WasmGC היא טכנולוגיה רבת עוצמה שיכולה לקדם את הדרך שבה מפתחים בונים אפליקציות אינטרנט. בשנים הקרובות, אנחנו ב-Google מקווים ש-WasmGC יתקדם בתמיכה בעיבוד שרשורים משותפים בזיכרון וישפר את הביצועים בשרשור יחיד. אנחנו ממליצים לכל מפתחי האתרים להשתמש ב-WasmGC בפרויקט הבא שלהם שמניב ביצועים גבוהים. מצטרפים אלינו והופכים את האינטרנט למקום מהיר וחלק יותר ביחד.
אישורים
תודה לכל מי שעבד על ההטמעה של WasmGC, והמקרה לדוגמה: Diwas Adhikary, מת'יו אולברייט, Ksenia Bukina, Julien Dramaix, Asim Fazal, Michael Fredericker, Goktug Gokdogan, Janice Gumanos, Adam Klein, Janice Gekary,