Cloudflare, Mozilla ve Facebook, JavaScript yüklemesini hızlandırmak için BinaryAST'ı geliştirdi

Cloudflare, Mozilla, Facebook ve Bloomberg'den mühendisler sunulan yeni biçim İkiliAST siteleri tarayıcıda açarken JavaScript kodunun teslimini ve işlenmesini hızlandırmak için. BinaryAST ayrıştırma aşamasını sunucu tarafına taşır ve önceden oluşturulmuş bir soyut sözdizimi ağacı sağlar (AST). Bir BinaryAST aldıktan sonra tarayıcı, JavaScript kaynak kodunu ayrıştırmayı atlayarak hemen derleme aşamasına geçebilir.

Test için tarafından hazırlanan MIT lisansı kapsamında sağlanan referans uygulaması. Node.js bileşenleri ayrıştırma için kullanılır ve optimizasyon ve AST oluşturma kodu Rust'ta yazılır. Tarayıcı tarafı desteği
BinaryAST zaten mevcut gece meclisi Firefox. BinaryAST'taki kodlayıcı, hem son site araçları düzeyinde hem de bir proxy veya içerik dağıtım ağı tarafında harici sitelerin komut dosyalarını paketlemek için kullanılabilir. Şu anda BinaryAST'ın çalışma grubu tarafından standardizasyon süreci halihazırda başlamıştır. ECMA TC39Bundan sonra format, gzip ve brotli gibi mevcut içerik sıkıştırma yöntemleriyle bir arada bulunabilecek.

Cloudflare, Mozilla ve Facebook, JavaScript yüklemesini hızlandırmak için BinaryAST'ı geliştirdi

Cloudflare, Mozilla ve Facebook, JavaScript yüklemesini hızlandırmak için BinaryAST'ı geliştirdi

JavaScript işlenirken kodun yüklenmesi ve ayrıştırılması aşamasında önemli miktarda zaman harcanır. Birçok popüler sitede indirilen JavaScript hacminin 10 MB'a yakın olduğu göz önüne alındığında (örneğin, LinkedIn için - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), JavaScript'in ilk işlenmesi önemli bir gecikmeye neden olur. Kod yüklenirken AST'nin anında tam olarak oluşturulamaması nedeniyle tarayıcı tarafındaki ayrıştırma aşaması da yavaşlar (tarayıcının, kod bloklarını elde etmek için işlevlerin sonu gibi, yüklemenin tamamlanmasını beklemesi gerekir). mevcut öğeleri ayrıştırmak için eksik olan bilgiler).

Kodu küçültülmüş ve sıkıştırılmış biçimde dağıtmanın yanı sıra, oluşturulan bayt kodunu tarayıcı tarafından önbelleğe alarak sorunu kısmen çözmeye çalışıyorlar. Modern sitelerde kod oldukça sık güncellenir, bu nedenle önbelleğe alma sorunu yalnızca kısmen çözer. WebAssembly bir çözüm olabilir, ancak kodun açıkça yazılmasını gerektirir ve mevcut JavaScript kodunun işlenmesini hızlandırmak için pek uygun değildir.

Diğer bir seçenek de JavaScript komut dosyaları yerine hazır derlenmiş bayt kodu sunmaktır, ancak üçüncü taraf bayt kodunun doğrulanmasının zor olması, doğrudan işlenmesinin Web katmanlaşmasına yol açabilmesi, ek güvenlik risklerinin ortaya çıkması ve ek güvenlik risklerinin ortaya çıkması nedeniyle tarayıcı motoru geliştiricileri buna karşıdır. evrensel bir bayt kodu formatı gereklidir.

BinaryAST, yeni bayt kodu oluşturmadan veya JavaScript dilini değiştirmeden mevcut kod geliştirme ve dağıtım modelinize uyum sağlamanıza olanak tanır. BinaryAST formatındaki veri boyutu, sıkıştırılmış küçültülmüş JavaScript koduyla karşılaştırılabilir düzeydedir ve kaynak metin ayrıştırma aşamasını ortadan kaldırarak işlem hızı gözle görülür şekilde artar. Ek olarak format, BinaryAST yüklenirken tüm verilerin tamamlanmasını beklemeden bayt koduna derleme yapılmasına olanak tanır. Ek olarak, sunucu tarafında ayrıştırma, kullanılmayan işlevleri ve gereksiz kodları, döndürülen BinaryAST temsilinden hariç tutmanıza olanak tanır; bu, tarayıcı tarafında ayrıştırma sırasında gereksiz trafiğin hem ayrıştırılmasında hem de iletilmesinde zaman kaybına neden olur.

BinaryAST'ın bir özelliği de orijinal sürümle tam olarak aynı olmayan ancak anlamsal olarak eşdeğer olan ve aynı değişken ve işlev adlarını içeren okunabilir JavaScript'i geri yükleme yeteneğidir (BinaryAST adları kaydeder, ancak konumlarla ilgili bilgileri kaydetmez) kod, biçimlendirme ve yorumlar). Madalyonun diğer yüzü ise yeni saldırı vektörlerinin ortaya çıkmasıdır, ancak geliştiricilere göre bunlar, bayt kodu dağıtımı gibi alternatiflerin kullanılmasına göre çok daha küçük ve daha kontrol edilebilirdir.

Facebook.com kodu üzerinde yapılan testler, JavaScript ayrıştırmanın CPU kaynaklarının %10-15'ini tükettiğini ve ayrıştırmanın, JIT için bayt kodu oluşturmaya ve ilk kod oluşturmaya göre daha fazla zaman aldığını gösterdi. SpiderMonkey motorunda tamamen AST oluşturma süresi 500-800 ms sürüyor ve BinaryAST kullanımı bu rakamı %70-90 oranında azalttı.
Genel olarak, çoğu web havai fişek için BinaryAST kullanıldığında, JavaScript ayrıştırma süresi optimizasyonsuz modda %3-10 oranında, kullanılmayan işlevleri göz ardı etme modu etkinleştirildiğinde ise %90-97 oranında azalır.
1.2 MB'lık bir JavaScript test seti çalıştırılırken BinaryAST'ın kullanılması, başlatma süresinin masaüstü sistemde (Intel i338) 314'den 7 ms'ye ve mobil cihazda (HTC One M2019) 1455'dan 8 ms'ye hızlanmasına olanak sağladı.

Kaynak: opennet.ru

Yorum ekle