Cloudflare, Mozilla dan Facebook membangunkan BinaryAST untuk mempercepatkan pemuatan JavaScript

Jurutera dari Cloudflare, Mozilla, Facebook dan Bloomberg ditawarkan format baharu binaryAST untuk mempercepatkan penghantaran dan pemprosesan kod JavaScript apabila membuka tapak dalam pelayar. BinaryAST mengalihkan fasa penghuraian ke bahagian pelayan dan membekalkan pokok sintaks abstrak yang telah dihasilkan (AST). Setelah menerima BinaryAST, penyemak imbas boleh terus ke peringkat penyusunan, memintas menghuraikan kod sumber JavaScript.

Untuk ujian disediakan pelaksanaan rujukan yang dibekalkan di bawah lesen MIT. Komponen Node.js digunakan untuk menghurai, dan kod untuk pengoptimuman dan penjanaan AST ditulis dalam Rust. Sokongan sisi pelayar
BinaryAST sudah tersedia di perhimpunan malam Firefox. Pengekod dalam BinaryAST boleh digunakan pada peringkat alat tapak akhir dan untuk skrip pembungkusan tapak luaran di sisi proksi atau rangkaian penghantaran kandungan. Pada masa ini, proses penyeragaman BinaryAST oleh kumpulan kerja telah pun bermula ECMA TC39, selepas itu format akan dapat wujud bersama dengan kaedah pemampatan kandungan sedia ada, seperti gzip dan brotli.

Cloudflare, Mozilla dan Facebook membangunkan BinaryAST untuk mempercepatkan pemuatan JavaScript

Cloudflare, Mozilla dan Facebook membangunkan BinaryAST untuk mempercepatkan pemuatan JavaScript

Apabila memproses JavaScript, sejumlah besar masa dibelanjakan dalam fasa pemuatan dan penghuraian kod. Memandangkan volum JavaScript yang dimuat turun di banyak tapak popular adalah hampir 10 MB (contohnya, untuk LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), pemprosesan awal JavaScript memperkenalkan kelewatan yang ketara. Peringkat penghuraian pada bahagian penyemak imbas juga diperlahankan kerana ketidakupayaan untuk membina AST sepenuhnya dengan cepat semasa kod dimuatkan (pelayar perlu menunggu blok kod untuk menyelesaikan pemuatan, seperti penghujung fungsi, untuk mendapatkan maklumat yang tiada untuk menghuraikan elemen semasa).

Mereka cuba menyelesaikan sebahagian masalah dengan mengedarkan kod dalam bentuk yang diminimumkan dan dimampatkan, serta dengan menyimpan kod bait yang dihasilkan oleh penyemak imbas. Di tapak moden, kod dikemas kini agak kerap, jadi caching hanya menyelesaikan sebahagian masalah. WebAssembly boleh menjadi penyelesaian, tetapi ia memerlukan penaipan eksplisit dalam kod dan tidak sesuai untuk mempercepatkan pemprosesan kod JavaScript sedia ada.

Pilihan lain ialah untuk menghantar kod bait tersusun sedia dan bukannya skrip JavaScript, tetapi pembangun enjin penyemak imbas menentangnya kerana kod bait pihak ketiga sukar untuk disahkan, pemprosesan langsungnya boleh membawa kepada stratifikasi Web, risiko keselamatan tambahan timbul dan pembangunan format bytecode universal diperlukan.

BinaryAST membolehkan anda menyesuaikan diri dengan model pembangunan dan penghantaran kod semasa anda tanpa membuat bytecode baharu atau menukar bahasa JavaScript. Saiz data dalam format BinaryAST adalah setanding dengan kod JavaScript diperkecil yang dimampatkan, dan kelajuan pemprosesan dengan menghapuskan fasa penghuraian teks sumber meningkat dengan ketara. Selain itu, format membenarkan kompilasi kepada bytecode apabila BinaryAST dimuatkan, tanpa menunggu semua data selesai. Di samping itu, penghuraian pada bahagian pelayan membolehkan anda mengecualikan fungsi yang tidak digunakan dan kod yang tidak diperlukan daripada perwakilan BinaryAST yang dikembalikan, yang, apabila menghuraikan pada bahagian pelayar, membuang masa untuk menghurai dan menghantar trafik yang tidak diperlukan.

Ciri BinaryAST juga ialah keupayaan untuk memulihkan JavaScript yang boleh dibaca yang tidak betul-betul sama dengan versi asal, tetapi semantik setara dan termasuk nama pembolehubah dan fungsi yang sama (BinaryAST menyimpan nama, tetapi tidak menyimpan maklumat tentang kedudukan dalam kod, pemformatan dan ulasan). Sisi lain syiling ialah kemunculan vektor serangan baharu, tetapi menurut pembangun, ia jauh lebih kecil dan lebih terkawal berbanding apabila menggunakan alternatif, seperti pengedaran kod bait.

Ujian kod facebook.com menunjukkan bahawa penghuraian JavaScript menggunakan 10-15% sumber CPU dan penghuraian mengambil lebih banyak masa daripada menjana kod bait dan penjanaan kod awal untuk JIT. Dalam enjin SpiderMonkey, masa untuk membina AST sepenuhnya mengambil masa 500-800 ms, dan penggunaan BinaryAST telah mengurangkan angka ini sebanyak 70-90%.
Secara umum, untuk kebanyakan bunga api web, apabila menggunakan BinaryAST, masa penghuraian JavaScript dikurangkan sebanyak 3-10% dalam mod tanpa pengoptimuman dan sebanyak 90-97% apabila mod mengabaikan fungsi yang tidak digunakan didayakan.
Apabila menjalankan set ujian JavaScript 1.2 MB, menggunakan BinaryAST membenarkan masa permulaan untuk mempercepatkan daripada 338 kepada 314 ms pada sistem desktop (Intel i7) dan dari 2019 hingga 1455 ms pada peranti mudah alih (HTC One M8).

Sumber: opennet.ru

Tambah komen