Google Spreadsheet adalah salah satu produk pertama di Google yang menggunakan WasmGC di Chrome. Langkah ini diumumkan pada tahun 2022, dan tim Spreadsheet dan Chrome berpartner dalam standardisasi, engineering, dan alat untuk memberikan masukan real-time tentang pengoptimalan. Kemitraan ini menetapkan preseden tentang cara tim engineer di Google dapat bekerja sama secara efektif dengan Chrome untuk membuat lebih banyak aplikasi Google berjalan di WasmGC.
Tantangan: JavaScript
Mesin penghitungan Google Spreadsheet awalnya ditulis dalam Java dan diluncurkan pada tahun 2006. Pada awal peluncuran produk, semua penghitungan dilakukan di server. Namun, sejak tahun 2013, mesin telah berjalan di browser menggunakan JavaScript. Hal ini awalnya dilakukan melalui Google Web Toolkit (GWT), dan kemudian melalui transpiler JavaScript Java ke Closure (J2CL). Mesin penghitungan JavaScript berjalan di Web Worker dan berkomunikasi dengan thread utama menggunakan MessageChannel
.
Memigrasikan pengguna dari server ke mesin penghitungan versi JavaScript (dan kemudian dari GWT ke J2CL) adalah tugas besar yang memerlukan validasi yang cermat. Untuk memastikan bahwa mesin penghitungan JavaScript menghasilkan hasil yang sama persis dengan versi Java, tim Spreadsheet mengembangkan mekanisme validasi internal. Mekanisme ini dapat memproses korpus sheet yang besar dan memvalidasi bahwa hasilnya identik di antara beberapa versi mesin penghitungan. Tim Spreadsheet menggunakan alat ini secara rutin untuk memvalidasi perubahan pada Spreadsheet. Namun, tim tidak hanya membandingkan hasil penghitungan tersebut, tetapi juga membandingkan performa antara JavaScript di klien dan Java di server. Mereka mendapati bahwa mesin penghitungan versi JavaScript lebih lambat tiga kali lipat daripada versi Java.
Mengapa JavaScript lebih lambat daripada Java?
JavaScript cepat untuk bahasa dinamis dengan jenis longgar. Investasi besar dalam compiler just-in-time (JIT) (misalnya, Maglev, Sparkplug, dan Turbofan) selama 15 tahun terakhir telah meningkatkan performa JavaScript. Namun, jenis longgar dan perilaku dinamis JavaScript membuat compiler JIT sulit menghasilkan kode yang optimal. Artinya, JavaScript masih tertinggal dari bahasa seperti Java dan C++ untuk throughput mentah. TypeScript menambahkan keamanan jenis ke JavaScript, tetapi informasi jenis tersebut dirancang untuk mempermudah pengembangan, bukan untuk memberikan jenis jaminan yang diperlukan oleh compiler untuk menghasilkan kode yang optimal. Untuk kasus seperti Google Spreadsheet, yang memerlukan waktu puluhan detik untuk menghitung spreadsheet besar, JavaScript memang cepat, tetapi tidak cukup cepat.
Solusi: WasmGC
WasmGC adalah ekstensi untuk spesifikasi WebAssembly yang ada yang menambahkan primitif yang diperlukan untuk mengompilasi bahasa yang dikumpulkan sampah (seperti Java). Misalnya, WasmGC menambahkan petunjuk untuk menentukan jenis dan mengalokasikan struktur data yang dikumpulkan sampah. WasmGC siap melakukan untuk bahasa yang dikumpulkan sampah seperti yang dilakukan Wasm untuk C++ (misalnya, Photoshop atau Google Earth), yaitu menghadirkannya ke web dengan kecepatan mendekati native. Di Google, kami percaya bahwa WasmGC berpotensi memiliki dampak yang lebih besar daripada Wasm karena popularitas bahasa yang dikumpulkan sampah.
Partner Google Workspace dengan Chrome
Spesifikasi draf MVP WasmGC dipublikasikan pada tahun 2019. Pada akhir tahun 2020, Google Workspace dan Chrome berpartner untuk mengevaluasi WasmGC menggunakan mesin penghitungan Spreadsheet. Tim multiplatform Workspace memiliki keahlian yang signifikan dalam membuat dan mengoptimalkan compiler dan transpiler. Spreadsheet, yang merupakan bagian dari Workspace, diidentifikasi sebagai kandidat ideal untuk mengevaluasi WasmGC: Spreadsheet sensitif terhadap performa dan memiliki mekanisme validasi performa dan kebenaran yang andal. Chrome memiliki tim V8 untuk mem-build dan mengoptimalkan runtime WasmGC serta kontributor untuk Binaryen guna mem-build pengoptimalan ahead-of-time (AOT). Antara Chrome dan Workspace, ada semua keahlian yang diperlukan untuk mem-build dan mengoptimalkan toolchain WasmGC, dengan Google Spreadsheet sebagai platform pengujian yang ideal.
Prototipe pertama
Pada pertengahan 2021, tim memiliki compiler Java ke WasmGC yang berfungsi. Menjelang akhir tahun yang sama, mereka memiliki versi prototipe Google Spreadsheet yang berjalan sebagai WasmGC dan melakukan penghitungan. Dalam prosesnya, mereka menghadapi banyak tantangan. Alat untuk membuat profil dan mengambil dump heap tidak ada dan harus dibuat. Implementasi yang ada mengandalkan banyak library JavaScript yang penggantinya harus ditemukan atau ditulis untuk WasmGC. Memvalidasi kebenaran mesin penghitungan Wasm adalah upaya yang memakan waktu karena sifat eksperimental dari spesifikasi, compiler, dan library baru. Namun, mekanisme validasi Spreadsheet sekali lagi sangat membantu. Tim akhirnya berhasil menyelesaikannya, dan data performa mulai tersedia pada awal 2022.
Pengoptimalan tambahan
Versi awal Spreadsheet Wasm menunjukkan performa penghitungan yang dua kali lebih lambat daripada JavaScript. Namun, ini bukan hasil yang buruk untuk spesifikasi baru, compiler baru, dan beberapa library baru. Dari titik ini, tim Spreadsheet mulai melakukan pengoptimalan. Dari pengoptimalan yang mereka temukan, beberapa kategori muncul:
- Mereplikasi pengoptimalan inti yang sudah ada di Java Virtual Machine (JVM) dan di V8.
- Menggunakan API browser yang dioptimalkan secara maksimal.
- Menghapus pola coding khusus JavaScript.
Pertama, tim Spreadsheet perlu mereplikasi pengoptimalan yang sudah ada di toolchain lain. Contoh terbaiknya adalah mengoptimalkan pengiriman metode virtual, yang telah lama dioptimalkan oleh JVM dan V8, tetapi tidak ada yang ada untuk WasmGC. Mengimplementasikan inline spekulatif dan devirtualisasi—dua pengoptimalan yang sangat umum—mempercepat waktu penghitungan sekitar 40% di Chrome.
Kedua, ada kasus saat API browser didukung oleh implementasi native yang dioptimalkan yang sulit bersaing dengan menggunakan Wasm. String dan ekspresi reguler adalah dua contoh yang baik. Secara khusus, dengan ekspresi reguler, tim melihat peningkatan kecepatan operasi ekspresi reguler hampir 100 kali lipat saat beralih dari re2j (dikompilasi ke WasmGC) ke API browser RegExp
di Chrome, yang dapat mengompilasi setiap ekspresi reguler ke kode mesinnya sendiri.
Terakhir, mereka mendapati bahwa pengoptimalan selama bertahun-tahun telah menyebabkan codebase terlalu disesuaikan dengan JavaScript. Misalnya, mereka memiliki struktur data inti di Spreadsheet yang mengaburkan batas antara array dan peta. Hal ini efisien di JavaScript, yang secara otomatis membuat model array jarang sebagai peta, tetapi lambat di platform lain. Jadi, mereka harus menulis ulang kode dengan cara yang lebih tidak bergantung pada platform. Ini adalah hal lain yang disukai tim tentang WebAssembly: teknologi ini memudahkan aplikasi multiplatform untuk mendapatkan performa yang baik di web. Anda tidak perlu menyesuaikan seluruh aplikasi dengan keanehan JavaScript.
Hasil akhir
Setelah semua pengoptimalan ini, Spreadsheet versi WasmGC akhir mencapai performa penghitungan yang dua kali lebih cepat dari JavaScript, yang mewakili peningkatan empat kali lipat dari titik awal versi WasmGC awal.
Kesimpulan
WasmGC adalah teknologi canggih yang berpotensi meningkatkan cara developer mem-build aplikasi web. Dalam beberapa tahun mendatang, di Google, kami berharap WasmGC dapat berkembang untuk mendukung multithreading memori bersama dan lebih meningkatkan performa single thread. Sebaiknya semua developer web mempertimbangkan untuk menggunakan WasmGC untuk project berperforma tinggi berikutnya. Bergabunglah bersama kami dan jadikan web sebagai tempat yang lebih cepat dan lancar.
Ucapan terima kasih
Terima kasih kepada mereka yang mengerjakan implementasi WasmGC dan studi kasus ini: 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, dan Emanuel Ziegler.