Cloudflare, Mozilla และ Facebook พัฒนา BinaryAST เพื่อเพิ่มความเร็วในการโหลด JavaScript

วิศวกรจาก Cloudflare, Mozilla, Facebook และ Bloomberg ที่นำเสนอ รูปแบบใหม่ ไบนารีAST เพื่อเพิ่มความเร็วในการส่งและประมวลผลโค้ด JavaScript เมื่อเปิดไซต์ในเบราว์เซอร์ BinaryAST ย้ายเฟสการแยกวิเคราะห์ไปยังฝั่งเซิร์ฟเวอร์และจัดหาแผนผังไวยากรณ์นามธรรมที่สร้างขึ้นแล้ว (AST). เมื่อได้รับ BinaryAST แล้ว เบราว์เซอร์สามารถเข้าสู่ขั้นตอนการคอมไพล์ได้ทันที โดยไม่ต้องแยกวิเคราะห์ซอร์สโค้ด JavaScript

สำหรับการทดสอบ เตรียมไว้ การใช้งานอ้างอิงที่จัดทำภายใต้ใบอนุญาต MIT ส่วนประกอบ Node.js ใช้สำหรับการแยกวิเคราะห์ และโค้ดสำหรับการเพิ่มประสิทธิภาพและการสร้าง AST เขียนด้วยภาษา Rust การสนับสนุนด้านเบราว์เซอร์
BinaryAST มีอยู่แล้วใน สร้างทุกคืน ไฟร์ฟอกซ์ ตัวเข้ารหัสใน BinaryAST สามารถใช้ได้ทั้งในระดับเครื่องมือไซต์ปลายทางและสำหรับสคริปต์แพ็คเกจของไซต์ภายนอกที่ด้านข้างของพร็อกซีหรือเครือข่ายการจัดส่งเนื้อหา ขณะนี้กระบวนการกำหนดมาตรฐานของ BinaryAST โดยคณะทำงานได้เริ่มต้นขึ้นแล้ว ECMA TC39หลังจากนั้นรูปแบบจะสามารถอยู่ร่วมกับวิธีการบีบอัดเนื้อหาที่มีอยู่ เช่น gzip และ brotli

Cloudflare, Mozilla และ Facebook พัฒนา BinaryAST เพื่อเพิ่มความเร็วในการโหลด JavaScript

Cloudflare, Mozilla และ Facebook พัฒนา BinaryAST เพื่อเพิ่มความเร็วในการโหลด JavaScript

เมื่อประมวลผล JavaScript จะใช้เวลาจำนวนมากในขั้นตอนการโหลดและแยกวิเคราะห์โค้ด เมื่อพิจารณาว่าปริมาณของ JavaScript ที่ดาวน์โหลดบนเว็บไซต์ยอดนิยมหลายแห่งอยู่ใกล้กับ 10 MB (ตัวอย่างเช่นสำหรับ LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB) การประมวลผลเริ่มต้นของ JavaScript ทำให้เกิดความล่าช้าอย่างมาก ขั้นตอนการแยกวิเคราะห์ทางฝั่งเบราว์เซอร์ก็ช้าลงเช่นกัน เนื่องจากไม่สามารถสร้าง AST ได้อย่างสมบูรณ์ทันทีเมื่อมีการโหลดโค้ด (เบราว์เซอร์ต้องรอให้บล็อกโค้ดโหลดเสร็จสมบูรณ์ เช่น จุดสิ้นสุดของฟังก์ชัน เพื่อรับ ข้อมูลขาดหายไปเพื่อแยกวิเคราะห์องค์ประกอบปัจจุบัน)

พวกเขากำลังพยายามแก้ไขปัญหาบางส่วนโดยการกระจายโค้ดในรูปแบบย่อเล็กสุดและบีบอัด รวมถึงโดยการแคชโค้ดไบต์ที่สร้างขึ้นโดยเบราว์เซอร์ ในไซต์สมัยใหม่ โค้ดได้รับการอัปเดตค่อนข้างบ่อย ดังนั้นการแคชจะช่วยแก้ปัญหาได้เพียงบางส่วนเท่านั้น WebAssembly อาจเป็นวิธีแก้ปัญหา แต่ต้องมีการพิมพ์โค้ดอย่างชัดเจน และไม่เหมาะสำหรับการเร่งการประมวลผลโค้ด JavaScript ที่มีอยู่

อีกทางเลือกหนึ่งคือการส่งไบต์โค้ดที่คอมไพล์สำเร็จรูปแทนสคริปต์ JavaScript แต่ผู้พัฒนากลไกเบราว์เซอร์ต่อต้านมัน เนื่องจากโค้ดไบต์ของบุคคลที่สามตรวจสอบได้ยาก การประมวลผลโดยตรงอาจนำไปสู่การแบ่งชั้นของเว็บ ความเสี่ยงด้านความปลอดภัยเพิ่มเติมเกิดขึ้น และการพัฒนาของ จำเป็นต้องมีรูปแบบรหัสไบต์สากล

BinaryAST ช่วยให้คุณสามารถปรับให้เข้ากับการพัฒนาโค้ดและรูปแบบการจัดส่งปัจจุบันของคุณ โดยไม่ต้องสร้างโค้ดไบต์ใหม่หรือเปลี่ยนภาษา JavaScript ขนาดของข้อมูลในรูปแบบ BinaryAST เทียบได้กับโค้ด JavaScript แบบย่อขนาดที่ถูกบีบอัด และความเร็วในการประมวลผลโดยการกำจัดขั้นตอนการแยกวิเคราะห์ข้อความต้นฉบับจะเพิ่มขึ้นอย่างเห็นได้ชัด นอกจากนี้ รูปแบบนี้ยังช่วยให้สามารถคอมไพล์โค้ดไบต์ได้ในขณะที่โหลด BinaryAST โดยไม่ต้องรอให้ข้อมูลทั้งหมดเสร็จสมบูรณ์ นอกจากนี้ การแยกวิเคราะห์ทางฝั่งเซิร์ฟเวอร์ยังช่วยให้คุณแยกฟังก์ชันที่ไม่ได้ใช้และโค้ดที่ไม่จำเป็นออกจากการแสดง BinaryAST ที่ส่งคืน ซึ่งเมื่อแยกวิเคราะห์ทางฝั่งเบราว์เซอร์ จะเสียเวลาทั้งการแยกวิเคราะห์และส่งการรับส่งข้อมูลที่ไม่จำเป็น

คุณลักษณะของ BinaryAST คือความสามารถในการกู้คืน JavaScript ที่อ่านได้ซึ่งไม่เหมือนกับเวอร์ชันดั้งเดิมทุกประการ แต่มีความหมายเทียบเท่าและมีชื่อตัวแปรและฟังก์ชันเหมือนกัน (BinaryAST บันทึกชื่อ แต่ไม่ได้บันทึกข้อมูลเกี่ยวกับตำแหน่งใน รหัส การจัดรูปแบบ และความคิดเห็น) อีกด้านหนึ่งของเหรียญคือการเกิดขึ้นของเวกเตอร์การโจมตีใหม่ๆ แต่ตามที่นักพัฒนาระบุว่า พวกมันมีขนาดเล็กกว่ามากและสามารถควบคุมได้ดีกว่าเมื่อใช้ทางเลือกอื่น เช่น การกระจายโค้ดไบต์

การทดสอบโค้ด facebook.com แสดงให้เห็นว่าการแยกวิเคราะห์ JavaScript ใช้ทรัพยากร CPU ถึง 10-15% และการแยกวิเคราะห์ใช้เวลานานกว่าการสร้างไบต์โค้ดและการสร้างโค้ดเริ่มต้นสำหรับ JIT ในเอ็นจิ้น SpiderMonkey เวลาในการสร้าง AST ให้เสร็จสมบูรณ์จะใช้เวลา 500-800 มิลลิวินาที และการใช้ BinaryAST ได้ลดตัวเลขนี้ลง 70-90%
โดยทั่วไป สำหรับเว็บพลุส่วนใหญ่ เมื่อใช้ BinaryAST เวลาการแยกวิเคราะห์ JavaScript จะลดลง 3-10% ในโหมดที่ไม่มีการปรับให้เหมาะสม และ 90-97% เมื่อเปิดใช้งานโหมดละเว้นฟังก์ชันที่ไม่ได้ใช้
เมื่อรันชุดทดสอบ JavaScript ขนาด 1.2 MB การใช้ BinaryAST ช่วยให้เวลาเริ่มต้นเร็วขึ้นจาก 338 เป็น 314 ms บนระบบเดสก์ท็อป (Intel i7) และจากปี 2019 เป็น 1455 ms บนอุปกรณ์พกพา (HTC One M8)

ที่มา: opennet.ru

เพิ่มความคิดเห็น