Cloudflare, Mozilla và Facebook phát triển BinaryAST để tăng tốc độ tải JavaScript

Các kỹ sư từ Cloudflare, Mozilla, Facebook và Bloomberg cung cấp Hình thức mới nhị phânAST để tăng tốc độ phân phối và xử lý mã JavaScript khi mở các trang web trong trình duyệt. BinaryAST chuyển giai đoạn phân tích cú pháp sang phía máy chủ và cung cấp cây cú pháp trừu tượng đã được tạo (AST). Khi nhận được BinaryAST, trình duyệt có thể ngay lập tức chuyển sang giai đoạn biên dịch, bỏ qua việc phân tích mã nguồn JavaScript.

Để thử nghiệm chuẩn bị triển khai tham chiếu được cung cấp theo giấy phép MIT. Các thành phần Node.js được sử dụng để phân tích cú pháp và mã để tối ưu hóa và tạo AST được viết bằng Rust. Hỗ trợ phía trình duyệt
BinaryAST đã có sẵn ở lắp ráp ban đêm Firefox. Bộ mã hóa trong BinaryAST có thể được sử dụng ở cả cấp độ công cụ của trang cuối và để đóng gói các tập lệnh của các trang bên ngoài bên cạnh proxy hoặc mạng phân phối nội dung. Hiện tại, quá trình tiêu chuẩn hóa BinaryAST của nhóm làm việc đã bắt đầu ECMA TC39, sau đó định dạng này sẽ có thể cùng tồn tại với các phương pháp nén nội dung hiện có, chẳng hạn như gzip và brotli.

Cloudflare, Mozilla và Facebook phát triển BinaryAST để tăng tốc độ tải JavaScript

Cloudflare, Mozilla và Facebook phát triển BinaryAST để tăng tốc độ tải JavaScript

Khi xử lý JavaScript, một lượng thời gian đáng kể sẽ được dành cho giai đoạn tải và phân tích mã. Xem xét rằng khối lượng JavaScript được tải xuống trên nhiều trang web phổ biến là gần 10 MB (ví dụ: đối với LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), quá trình xử lý JavaScript ban đầu gây ra độ trễ đáng kể. Giai đoạn phân tích cú pháp ở phía trình duyệt cũng bị chậm lại do không thể xây dựng đầy đủ AST ngay khi mã được tải (trình duyệt phải đợi các khối mã tải xong, chẳng hạn như kết thúc các chức năng, để có được thông tin còn thiếu để phân tích các phần tử hiện tại).

Họ đang cố gắng giải quyết một phần vấn đề bằng cách phân phối mã ở dạng thu nhỏ và nén, cũng như bằng cách lưu vào bộ nhớ đệm mã byte được tạo bởi trình duyệt. Trên các trang web hiện đại, mã được cập nhật khá thường xuyên, do đó bộ nhớ đệm chỉ giải quyết được một phần vấn đề. WebAssembly có thể là một giải pháp, nhưng nó yêu cầu phải nhập mã rõ ràng và không phù hợp để tăng tốc quá trình xử lý mã JavaScript hiện có.

Một tùy chọn khác là cung cấp mã byte được biên dịch sẵn thay vì tập lệnh JavaScript, nhưng các nhà phát triển công cụ trình duyệt phản đối điều đó vì mã byte của bên thứ ba khó xác minh, việc xử lý trực tiếp nó có thể dẫn đến phân tầng Web, phát sinh thêm rủi ro bảo mật và phát triển một định dạng mã byte phổ quát là bắt buộc.

BinaryAST cho phép bạn phù hợp với mô hình phân phối và phát triển mã hiện tại của mình mà không cần tạo mã byte mới hoặc thay đổi ngôn ngữ JavaScript. Kích thước của dữ liệu ở định dạng BinaryAST tương đương với mã JavaScript nén được nén và tốc độ xử lý bằng cách loại bỏ giai đoạn phân tích văn bản nguồn tăng lên đáng kể. Ngoài ra, định dạng này cho phép biên dịch thành mã byte khi BinaryAST được tải mà không cần đợi tất cả dữ liệu hoàn tất. Ngoài ra, phân tích cú pháp ở phía máy chủ cho phép bạn loại trừ các chức năng không sử dụng và mã không cần thiết khỏi biểu diễn BinaryAST được trả về, khi phân tích cú pháp ở phía trình duyệt sẽ lãng phí thời gian cả phân tích cú pháp và truyền lưu lượng không cần thiết.

Một tính năng của BinaryAST còn là khả năng khôi phục JavaScript có thể đọc được, không hoàn toàn giống với phiên bản gốc nhưng tương đương về mặt ngữ nghĩa và bao gồm cùng tên các biến và hàm (BinaryAST lưu tên, nhưng không lưu thông tin về các vị trí trong mã, định dạng và nhận xét). Mặt khác của đồng tiền là sự xuất hiện của các vectơ tấn công mới, nhưng theo các nhà phát triển, chúng nhỏ hơn nhiều và dễ kiểm soát hơn so với khi sử dụng các lựa chọn thay thế, chẳng hạn như phân phối mã byte.

Các thử nghiệm mã facebook.com cho thấy việc phân tích cú pháp JavaScript tiêu tốn 10-15% tài nguyên CPU và việc phân tích cú pháp mất nhiều thời gian hơn so với việc tạo mã byte và tạo mã ban đầu cho JIT. Trong công cụ SpiderMonkey, thời gian để xây dựng hoàn chỉnh một AST mất 500-800 ms và việc sử dụng BinaryAST đã giảm con số này xuống 70-90%.
Nhìn chung, đối với hầu hết các web pháo hoa, khi sử dụng BinaryAST, thời gian phân tích cú pháp JavaScript giảm 3-10% ở chế độ không tối ưu hóa và 90-97% khi bật chế độ bỏ qua các chức năng không sử dụng.
Khi chạy bộ kiểm tra JavaScript 1.2 MB, sử dụng BinaryAST cho phép thời gian khởi động tăng tốc từ 338 lên 314 ms trên hệ thống máy tính để bàn (Intel i7) và từ 2019 lên 1455 ms trên thiết bị di động (HTC One M8).

Nguồn: opennet.ru

Thêm một lời nhận xét