Lý do Google Trang tính chuyển trình chạy tính toán từ JavaScript sang WasmGC

Google Trang tính là một trong những sản phẩm đầu tiên của Google sử dụng WasmGC trên Chrome. Sự thay đổi này được công bố vào năm 2022 và đội ngũ Trang tính và Chrome đã hợp tác với nhau trong quá trình tiêu chuẩn hoá, kỹ thuật và công cụ để đưa ra ý kiến phản hồi theo thời gian thực về các hoạt động tối ưu hoá. Sự hợp tác này đã tạo nên tiền lệ về cách các nhóm kỹ sư tại Google có thể làm việc hiệu quả với Chrome để có thêm nhiều ứng dụng Google chạy trên WasmGC.

Thách thức: JavaScript

Công cụ tính toán của Google Trang tính ban đầu được viết bằng Java và ra mắt vào năm 2006. Trong những ngày đầu của sản phẩm, tất cả quá trình tính toán đều diễn ra trên máy chủ. Tuy nhiên, từ năm 2013, công cụ này đã chạy trong trình duyệt bằng JavaScript. Điều này ban đầu được thực hiện thông qua Bộ công cụ web của Google (GWT) và sau đó thông qua trình chuyển mã JavaScript từ Java để đóng (J2CL). Công cụ tính toán JavaScript chạy trong Web Worker và giao tiếp với luồng chính bằng MessageChannel.

Di chuyển người dùng từ máy chủ sang phiên bản JavaScript của công cụ tính toán (và sau đó từ GWT sang J2CL) là một thực hiện quan trọng đòi hỏi phải xác thực cẩn thận. Để đảm bảo công cụ tính toán JavaScript tạo ra kết quả giống hệt với phiên bản Java, nhóm Trang tính đã phát triển một cơ chế xác thực nội bộ. Cơ chế này có thể xử lý lượng lớn trang tính và xác thực rằng kết quả giống nhau giữa nhiều phiên bản của công cụ tính toán. Nhóm Trang tính sử dụng công cụ này thường xuyên để xác thực các thay đổi đối với Trang tính. Tuy nhiên, nhóm không chỉ so sánh kết quả của các phép tính đó mà còn so sánh hiệu suất giữa JavaScript trên ứng dụng và Java trên máy chủ. Họ nhận thấy rằng phiên bản JavaScript của công cụ tính toán chậm hơn 3 lần so với phiên bản Java.

Tại sao JavaScript chậm hơn Java?

JavaScript nhanh dành cho ngôn ngữ động, loại lỏng lẻo. Việc đầu tư lớn vào các trình biên dịch đúng thời điểm (JIT) (ví dụ: Maglev, SparkparkTurbofan) trong 15 năm qua đã làm tăng hiệu suất của JavaScript. Tuy nhiên, các kiểu rời và hành vi động của JavaScript khiến trình biên dịch JIT khó tạo mã tối ưu. Điều này có nghĩa là JavaScript vẫn bị tụt hậu so với các ngôn ngữ như Java và C++ đối với thông lượng thô. TypeScript thêm an toàn về kiểu vào JavaScript, nhưng thông tin về kiểu đó được thiết kế để giúp bạn phát triển dễ dàng hơn, chứ không phải đảm bảo mà trình biên dịch cần để tạo mã tối ưu. Đối với các trường hợp như Google Trang tính, nơi các bảng tính lớn có thể mất hàng chục giây để tính toán, JavaScript có tốc độ nhanh nhưng không đủ nhanh.

Giải pháp: WasmGC

WasmGC là một phần mở rộng của thông số kỹ thuật WebAssembly hiện có, bổ sung các dữ liệu gốc cần thiết để biên dịch các ngôn ngữ thu thập rác (chẳng hạn như Java). Ví dụ: WasmGC thêm hướng dẫn về cách xác định loại và phân bổ cấu trúc dữ liệu thu thập rác. WasmGC sẵn sàng thực hiện các ngôn ngữ thu thập rác như những gì Wasm đã làm cho C++ (ví dụ: Photoshop hoặc Google Earth), nhằm đưa chúng lên web với tốc độ gần như gốc. Tại Google, chúng tôi tin rằng WasmGC có tiềm năng tạo ra sức ảnh hưởng lớn hơn cả Wasm do sự phổ biến của các ngôn ngữ thu thập rác.

Đối tác Google Workspace với Chrome

Năm 2019, chúng tôi đã xuất bản bản đặc tả kỹ thuật dự thảo MVP của WasmGC. Cuối năm 2020, Google Workspace và Chrome hợp tác để đánh giá WasmGC bằng công cụ tính toán của Trang tính. Đội ngũ đa nền tảng của Workspace có chuyên môn đáng kể trong việc xây dựng và tối ưu hoá trình biên dịch và trình biên dịch. Trang tính là một phần của Workspace được xác định là lựa chọn lý tưởng để đánh giá WasmGC: trang tính này nhạy cảm về hiệu suất và có cơ chế xác thực hiệu suất và độ chính xác mạnh mẽ. Chrome có nhóm V8 xây dựng và tối ưu hoá môi trường thời gian chạy WasmGC, cũng như đóng góp cho Binaryen để tối ưu hoá trước khi triển khai (AOT). Chrome và Workspace cung cấp đầy đủ kiến thức chuyên môn cần thiết để xây dựng và tối ưu hoá chuỗi công cụ WasmGC, trong đó Google Trang tính là một công cụ thử nghiệm lý tưởng.

Nguyên mẫu đầu tiên

Vào giữa năm 2021, các nhóm đã có một trình biên dịch Java cho WasmGC đang hoạt động. Vào cuối năm đó, họ đã có một phiên bản nguyên mẫu của Google Trang tính chạy với tên WasmGC và đang tính toán. Hành trình của họ đã chinh phục được nhiều thử thách. Công cụ phân tích và lấy tệp báo lỗi chưa tồn tại và phải được xây dựng. Cách triển khai hiện tại dựa vào nhiều thư viện JavaScript cần phải tìm hoặc viết thay thế cho WasmGC. Việc xác thực độ chính xác của công cụ tính toán Wasm tốn nhiều thời gian do tính chất thử nghiệm của quy cách, trình biên dịch và các thư viện mới. Nhưng các cơ chế xác thực của Trang tính một lần nữa cực kỳ hữu ích. Cuối cùng, các nhóm đã xử lý xong mọi việc, và dữ liệu hiệu suất bắt đầu có vào đầu năm 2022.

Các tính năng tối ưu hoá bổ sung

Phiên bản ban đầu của Trang tính Wasm cho thấy hiệu suất tính toán chậm hơn khoảng hai lần so với JavaScript. Tuy nhiên, đây không phải là kết quả tệ cho một thông số kỹ thuật mới, trình biên dịch mới và một số thư viện mới. Từ thời điểm này, nhóm Trang tính bắt đầu tối ưu hoá. Trong số những phương pháp tối ưu hoá họ tìm được, có một vài danh mục như sau:

  • Sao chép các biện pháp tối ưu hoá cốt lõi đã tồn tại trong Máy ảo Java (JVM) và trong V8.
  • Sử dụng API trình duyệt được tối ưu hoá cao.
  • Xoá mẫu lập trình dành riêng cho JavaScript.

Trước tiên, nhóm Trang tính cần sao chép các biện pháp tối ưu hoá đã có trong các chuỗi công cụ khác. Ví dụ hay nhất về vấn đề này là tối ưu hoá việc điều phối phương thức ảo, từ lâu đã được JVM và V8 tối ưu hoá, nhưng chưa có gì tồn tại cho WasmGC. Việc triển khai tính năng cùng dòng suy đoánhuỷ ảo hoá (hai cách tối ưu hoá rất phổ biến) đã làm tăng thời gian tính toán lên khoảng 40% trên Chrome.

Thứ hai, có những trường hợp API trình duyệt được hỗ trợ bởi các phương thức triển khai gốc đã tối ưu hoá sẽ khó cạnh tranh với việc sử dụng Wasm. Chuỗi và biểu thức chính quy là hai ví dụ điển hình. Cụ thể, nhờ các biểu thức chính quy, đội ngũ này đã tăng tốc gần 100 lần các thao tác biểu thức chính quy khi chuyển từ re2j (được biên dịch thành WasmGC) sang API trình duyệt RegExp trong Chrome, giúp biên dịch từng biểu thức chính quy thành mã máy của riêng nó.

Cuối cùng, họ nhận thấy rằng nhiều năm tối ưu hoá đã khiến cơ sở mã trở nên quá phù hợp với JavaScript. Ví dụ: chúng có một cấu trúc dữ liệu cốt lõi trong Trang tính, làm mờ ranh giới giữa các mảng và bản đồ. Điều này hiệu quả trong JavaScript, vốn tự động mô hình hoá các mảng thưa thớt dưới dạng bản đồ, nhưng chậm trên các nền tảng khác. Vì vậy, họ phải viết lại mã theo cách không phụ thuộc vào nền tảng hơn. Đây là một điều khác mà nhóm thích về WebAssembly: nó giúp các ứng dụng đa nền tảng dễ dàng đạt được hiệu suất tốt trên web. Bạn không cần phải điều chỉnh toàn bộ ứng dụng của mình theo các đặc trưng của JavaScript.

Kết quả cuối cùng

Sau tất cả những phương pháp tối ưu hoá này, phiên bản WasmGC cuối cùng của Trang tính đạt được hiệu suất tính toán nhanh gấp hai lần JavaScript, thể hiện sự cải thiện gấp 4 lần so với điểm xuất phát của phiên bản WasmGC ban đầu.

Kết luận

WasmGC là một công nghệ mạnh mẽ có tiềm năng thúc đẩy cách thức các nhà phát triển xây dựng các ứng dụng web. Trong những năm tới, tại Google, chúng tôi hy vọng có thể thấy WasmGC đạt được tiến bộ trong việc hỗ trợ tính năng đa luồng bộ nhớ dùng chung và cải thiện hơn nữa hiệu suất theo luồng đơn. Tất cả các nhà phát triển web nên cân nhắc sử dụng WasmGC cho dự án hiệu suất cao tiếp theo của họ. Hãy tham gia cùng chúng tôi và cùng nhau phát triển một môi trường web nhanh hơn, mượt mà hơn!

Xác nhận

Cảm ơn các bạn đã hỗ trợ triển khai WasmGC.