Cloudflare, Mozilla dan Facebook mengembangkan BinaryAST untuk mempercepat pemuatan JavaScript

Insinyur dari Cloudflare, Mozilla, Facebook dan Bloomberg disarankan format baru BinerAST untuk mempercepat pengiriman dan pemrosesan kode JavaScript saat membuka situs di browser. BinaryAST memindahkan fase penguraian ke sisi server dan menyediakan pohon sintaksis abstrak yang sudah dibuat (AST). Setelah menerima BinaryAST, browser dapat langsung melanjutkan ke tahap kompilasi, melewati penguraian kode sumber JavaScript.

Untuk pengujian siap implementasi referensi yang disediakan di bawah lisensi MIT. Komponen Node.js digunakan untuk parsing, dan kode untuk optimasi dan pembuatan AST ditulis dalam Rust. Dukungan sisi browser
BinaryAST sudah tersedia di bangunan malam Firefox. Encoder di BinaryAST dapat digunakan baik di tingkat perkakas situs akhir maupun untuk mengemas skrip situs eksternal di sisi proxy atau jaringan pengiriman konten. Saat ini proses standardisasi BinaryAST oleh kelompok kerja sudah dimulai ECMA TC39, setelah itu formatnya akan dapat berdampingan dengan metode kompresi konten yang ada, seperti gzip dan brotli.

Cloudflare, Mozilla dan Facebook mengembangkan BinaryAST untuk mempercepat pemuatan JavaScript

Cloudflare, Mozilla dan Facebook mengembangkan BinaryAST untuk mempercepat pemuatan JavaScript

Saat memproses JavaScript, banyak waktu yang dihabiskan dalam fase pemuatan dan penguraian kode. Mengingat volume JavaScript yang diunduh di banyak situs populer mendekati 10 MB (misalnya, untuk LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), pemrosesan awal JavaScript menyebabkan penundaan yang signifikan. Tahap penguraian di sisi browser juga melambat karena ketidakmampuan untuk sepenuhnya membangun AST dengan cepat saat kode dimuat (browser harus menunggu blok kode menyelesaikan pemuatan, seperti akhir fungsi, untuk mendapatkan informasi yang hilang untuk mengurai elemen saat ini).

Mereka mencoba memecahkan sebagian masalah dengan mendistribusikan kode dalam bentuk yang diperkecil dan dikompresi, serta dengan menyimpan bytecode yang dihasilkan oleh browser dalam cache. Di situs modern, kodenya cukup sering diperbarui, jadi caching hanya menyelesaikan sebagian masalah. WebAssembly bisa menjadi solusi, tetapi memerlukan pengetikan kode secara eksplisit dan tidak cocok untuk mempercepat pemrosesan kode JavaScript yang ada.

Pilihan lainnya adalah mengirimkan bytecode terkompilasi yang sudah jadi alih-alih skrip JavaScript, namun pengembang mesin browser menentangnya karena bytecode pihak ketiga sulit diverifikasi, pemrosesan langsungnya dapat menyebabkan stratifikasi Web, timbul risiko keamanan tambahan, dan pengembangan diperlukan format bytecode universal.

BinaryAST memungkinkan Anda menyesuaikan dengan pengembangan kode dan model pengiriman Anda saat ini tanpa membuat bytecode baru atau mengubah bahasa JavaScript. Ukuran data dalam format BinaryAST sebanding dengan kode JavaScript yang diperkecil dan dikompresi, dan kecepatan pemrosesan dengan menghilangkan fase penguraian teks sumber meningkat secara nyata. Selain itu, format ini memungkinkan kompilasi ke bytecode saat BinaryAST dimuat, tanpa menunggu semua data selesai. Selain itu, penguraian di sisi server memungkinkan Anda mengecualikan fungsi yang tidak digunakan dan kode yang tidak perlu dari representasi BinaryAST yang dikembalikan, yang, ketika diurai di sisi browser, membuang waktu baik untuk penguraian maupun transmisi lalu lintas yang tidak perlu.

Fitur BinaryAST juga adalah kemampuan untuk memulihkan JavaScript yang dapat dibaca yang tidak persis sama dengan versi aslinya, namun setara secara semantik dan menyertakan nama variabel dan fungsi yang sama (BinaryAST menyimpan nama, tetapi tidak menyimpan informasi tentang posisi di kode, format dan komentar). Sisi lain dari hal ini adalah munculnya vektor serangan baru, tetapi menurut pengembangnya, vektor serangan tersebut jauh lebih kecil dan lebih dapat dikontrol dibandingkan saat menggunakan alternatif, seperti distribusi bytecode.

Pengujian kode facebook.com menunjukkan bahwa penguraian JavaScript menghabiskan 10-15% sumber daya CPU dan penguraian memerlukan waktu lebih lama daripada menghasilkan bytecode dan pembuatan kode awal untuk JIT. Di mesin SpiderMonkey, waktu untuk membangun AST sepenuhnya membutuhkan waktu 500-800 ms, dan penggunaan BinaryAST telah mengurangi angka ini sebesar 70-90%.
Secara umum, untuk sebagian besar kembang api web, saat menggunakan BinaryAST, waktu penguraian JavaScript berkurang 3-10% dalam mode tanpa pengoptimalan dan 90-97% saat mode mengabaikan fungsi yang tidak digunakan diaktifkan.
Saat menjalankan rangkaian pengujian JavaScript 1.2 MB, penggunaan BinaryAST memungkinkan waktu startup meningkat dari 338 menjadi 314 ms pada sistem desktop (Intel i7) dan dari 2019 menjadi 1455 ms pada perangkat seluler (HTC One M8).

Sumber: opennet.ru

Tambah komentar