Google E-Tablolar'ın hesaplama çalışanını JavaScript'ten WasmGC'ye taşımasının nedeni

Google E-Tablolar, Chrome'da WasmGC'yi kullanan ilk Google ürünlerinden biridir. 2022'de duyurulan bu değişiklik için E-Tablolar ve Chrome ekipleri, optimizasyonlarla ilgili anında geri bildirim sağlamak üzere standardizasyon, mühendislik ve araçlar konusunda iş ortaklığı yaptı. Bu iş ortaklığı, Google'daki mühendislik ekiplerinin WasmGC'de daha fazla Google uygulamasının çalışmasını sağlamak için Chrome ile etkili bir şekilde nasıl çalışabileceği konusunda bir emsal oluşturdu.

Zorluk: JavaScript

Google E-Tablolar hesaplama motoru ilk olarak Java ile yazılmış ve 2006'da kullanıma sunulmuştur. Ürünün ilk günlerinde tüm hesaplamalar sunucuda yapılıyordu. Ancak 2013'ten itibaren motor, JavaScript kullanılarak tarayıcıda çalışmaktadır. Bu işlem başlangıçta Google Web Toolkit (GWT) aracılığıyla, daha sonra ise Java to Closure JavaScript transpiler (J2CL) aracılığıyla gerçekleştirildi. JavaScript hesaplama motoru bir Web Worker'da çalışır ve MessageChannel kullanarak ana iş parçacığıyla iletişim kurar.

Kullanıcıları sunucudan hesaplama motorunun JavaScript sürümüne (ve daha sonra GWT'den J2CL'ye) taşımak, dikkatli bir doğrulama gerektiren büyük bir işlemdi. E-Tablolar ekibi, JavaScript hesaplama motorunun Java sürümüyle tam olarak aynı sonuçları ürettiğinden emin olmak için dahili bir doğrulama mekanizması geliştirdi. Bu mekanizma, büyük bir sayfa kümesini işleyebilir ve sonuçların hesaplama motorunun birden fazla sürümünde aynı olduğunu doğrulayabilir. E-Tablolar ekibi, E-Tablolar'daki değişiklikleri doğrulamak için bu aracı düzenli olarak kullanır. Ancak ekip, yalnızca bu hesaplamaların sonuçlarını karşılaştırmakla kalmadı, aynı zamanda istemcideki JavaScript ile sunucudaki Java arasındaki performansı da karşılaştırdı. Hesaplama motorunun JavaScript sürümünün, Java sürümünden üç kat daha yavaş olduğunu tespit ettiler.

JavaScript neden Java'dan daha yavaş?

JavaScript, gevşek yazılmış ve dinamik bir dil için hızlıdır. Son 15 yılda tam zamanında (JIT) derleyicilere (ör. Maglev, Sparkplug ve Turbofan) yapılan yoğun yatırım, JavaScript'in performansını artırdı. Ancak JavaScript'in gevşek türleri ve dinamik davranışı, JIT derleyicilerinin optimum kod oluşturmasını zorlaştırır. Bu nedenle, JavaScript ham işleme hızı açısından Java ve C++ gibi dillerin gerisinde kalmaya devam ediyor. TypeScript, JavaScript'e tür güvenliği ekler ancak bu tür bilgileri, derleyicilerin optimum kod oluşturmak için ihtiyaç duyduğu türden garantiler sağlamak üzere değil, geliştirmeyi kolaylaştırmak için tasarlanmıştır. Google E-Tablolar gibi büyük e-tabloların hesaplanması onlarca saniye sürebilen durumlarda JavaScript hızlı olsa da yeterince hızlı değildir.

Çözüm: WasmGC

WasmGC, mevcut WebAssembly spesifikasyonunun bir uzantısıdır ve çöp toplama işlemi yapılan dilleri (ör. Java) derlemek için gereken temel öğeleri ekler. Örneğin, WasmGC, türleri tanımlama ve çöp toplama işlemiyle ayrılan veri yapılarını ayırma talimatları ekler. WasmGC, çöp toplama özelliği olan diller için Wasm'ın C++ (ör. Photoshop veya Google Earth) için yaptığı şeyi yapmaya hazırlanıyor. Bu da bu dilleri web'e neredeyse yerel hızda getirmek. Google olarak, çöp toplama dillerinin popülerliği nedeniyle WasmGC'nin Wasm'den daha da etkili olabileceğine inanıyoruz.

Google Workspace, Chrome ile birlikte çalışır

WasmGC MVP taslak spesifikasyonu 2019'da yayınlandı. 2020'nin sonlarında Google Workspace ve Chrome, E-Tablolar hesaplama motorunu kullanarak WasmGC'yi değerlendirmek için iş ortaklığı yaptı. Workspace'in çok platformlu ekibi, derleyiciler ve dönüştürücüler oluşturma ve optimize etme konusunda önemli uzmanlığa sahiptir. Workspace'in bir parçası olan E-Tablolar, WasmGC'yi değerlendirmek için ideal bir aday olarak belirlendi. Performansa duyarlı olan E-Tablolar'da güçlü performans ve doğruluk doğrulama mekanizmaları bulunuyor. Chrome, WasmGC çalışma zamanını oluşturup optimize etmek için V8 ekibine ve önceden derleme (AOT) optimizasyonları oluşturmak için Binaryen'e katkıda bulunanlara sahiptir. Chrome ve Workspace, Google E-Tablolar'ı ideal bir test yatağı olarak kullanarak WasmGC araç zinciri oluşturmak ve optimize etmek için gereken tüm uzmanlığı sunar.

İlk prototip

2021'in ortalarına gelindiğinde ekipler, Java'dan WasmGC'ye derleyici üzerinde çalışıyordu. Aynı yılın sonlarına doğru, WasmGC olarak çalışan ve hesaplamalar yapan bir Google E-Tablolar prototip sürümüne sahiptiler. Bu süreçte birçok zorlukla karşılaştılar. Profil oluşturma ve yığın dökümü alma araçları mevcut değildi ve oluşturulması gerekiyordu. Mevcut uygulama, WasmGC için değiştirilmesi veya yazılması gereken birçok JavaScript kitaplığına dayanıyordu. Wasm hesaplama motorunun doğruluğunu onaylamak, spesifikasyonun, derleyicinin ve yeni kitaplıkların deneysel yapısı nedeniyle zaman alıcı bir süreçti. Ancak E-Tablolar'ın doğrulama mekanizmaları bir kez daha son derece yardımcı oldu. Sonunda ekipler her şeyi çalışır hâle getirdi ve performans verileri 2022'nin başlarında gelmeye başladı.

Ek optimizasyonlar

E-Tablolar Wasm'ın ilk sürümünde hesaplama performansı, JavaScript'e kıyasla yaklaşık iki kat daha yavaştı. Ancak bu, yeni bir spesifikasyon, yeni bir derleyici ve birkaç yeni kitaplık için kötü bir sonuç değildir. Bu noktadan sonra E-Tablolar ekibi optimizasyon yapmaya başladı. Bulunan optimizasyonlar arasında birkaç kategori öne çıktı:

  • Java sanal makinesinde (JVM) ve V8'de zaten mevcut olan temel optimizasyonları kopyalama.
  • Yüksek düzeyde optimize edilmiş tarayıcı API'lerini kullanma.
  • JavaScript'e özgü kodlama kalıplarını kaldırma

Öncelikle, E-Tablolar ekibinin diğer araç zincirlerinde zaten mevcut olan optimizasyonları kopyalaması gerekiyordu. Bunun en iyi örneği, uzun süredir JVM ve V8 tarafından optimize edilen sanal yöntem gönderme işleminin optimize edilmesidir. Ancak WasmGC için bu özellik mevcut değildi. Çok yaygın iki optimizasyon olan tahmini satır içi genişletme ve devirtualization'ın uygulanması, Chrome'da hesaplama süresini yaklaşık% 40 oranında hızlandırdı.

İkincisi, tarayıcı API'lerinin, Wasm ile rekabet etmenin zor olduğu optimize edilmiş yerel uygulamalarla desteklendiği durumlar vardır. Dizeler ve normal ifadeler, bu duruma iki iyi örnektir. Özellikle normal ifadelerle, re2j'den (WasmGC'ye derlenmiş) Chrome'daki RegExp tarayıcı API'sine geçiş yapıldığında normal ifade işlemlerinde yaklaşık 100 kat hızlanma görüldü. Bu API, her normal ifadeyi kendi makine koduna derleyebilir.

Son olarak, yıllarca süren optimizasyonun kod tabanının JavaScript'e aşırı uyum sağlamasına neden olduğunu fark ettiler. Örneğin, E-Tablolar'da diziler ve haritalar arasındaki çizgileri bulanıklaştıran temel bir veri yapısı vardı. Bu, seyrek dizileri otomatik olarak harita olarak modellediği için JavaScript'te verimlidir ancak diğer platformlarda yavaştır. Bu nedenle kodu platformdan bağımsız olacak şekilde yeniden yazmaları gerekiyordu. Ekibin WebAssembly hakkında beğendiği bir diğer nokta da çok platformlu uygulamaların web'de iyi performans göstermesini kolaylaştırmasıdır. Uygulamanızın tamamını JavaScript'in kendine özgü özelliklerine göre şekillendirmeniz gerekmez.

Nihai sonuç

Tüm bu optimizasyonlardan sonra, E-Tablolar'ın nihai WasmGC sürümü, yaklaşık olarak JavaScript'in iki katı hızda hesaplama performansı elde ederek ilk WasmGC sürümünün başlangıç noktasından dört kat daha iyi performans gösteriyor.

Sonuç

WasmGC, geliştiricilerin web uygulamaları oluşturma şeklini ilerletme potansiyeline sahip güçlü bir teknolojidir. Google olarak, önümüzdeki yıllarda WasmGC'nin paylaşılan bellekli çoklu iş parçacığı desteği sunacak şekilde gelişmesini ve tek iş parçacıklı performansı daha da iyileştirmesini umuyoruz. Tüm web geliştiricilerin, bir sonraki yüksek performanslı projelerinde WasmGC'yi kullanmayı düşünmelerini öneririz. Bize katılın ve web'i birlikte daha hızlı ve sorunsuz bir yer haline getirin.

Teşekkür

WasmGC uygulamasında ve bu örnek olayda çalışan herkese teşekkür ederiz: 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 ve Emanuel Ziegler.