Cloudflare, Mozilla și Facebook dezvoltă BinaryAST pentru a accelera încărcarea JavaScript

Ingineri de la Cloudflare, Mozilla, Facebook și Bloomberg a oferit format nou binarAST pentru a accelera livrarea și procesarea codului JavaScript la deschiderea site-urilor în browser. BinaryAST mută faza de analiză pe partea de server și furnizează un arbore de sintaxă abstractă deja generat (AST). La primirea unui BinaryAST, browserul poate trece imediat la etapa de compilare, ocolind analizarea codului sursă JavaScript.

Pentru testare pregătit implementare de referință furnizată sub licența MIT. Componentele Node.js sunt folosite pentru parsare, iar codul pentru optimizare și generarea AST este scris în Rust. Suport pe partea browserului
BinaryAST este deja disponibil în construcții nocturne Firefox. Codificatorul din BinaryAST poate fi folosit atât la nivel de instrumente ale site-ului final, cât și pentru ambalarea scripturilor de site-uri externe pe partea unei rețele proxy sau de livrare de conținut. În prezent, procesul de standardizare a BinaryAST de către grupul de lucru a început deja ECMA TC39, după care formatul va putea coexista cu metodele existente de comprimare a conținutului, cum ar fi gzip și brotli.

Cloudflare, Mozilla și Facebook dezvoltă BinaryAST pentru a accelera încărcarea JavaScript

Cloudflare, Mozilla și Facebook dezvoltă BinaryAST pentru a accelera încărcarea JavaScript

La procesarea JavaScript, se petrece o cantitate semnificativă de timp în faza de încărcare și analiză a codului. Având în vedere că volumul de JavaScript descărcat pe multe site-uri populare este aproape de 10 MB (de exemplu, pentru LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), procesarea inițială a JavaScript introduce o întârziere semnificativă. Etapa de analiză din partea browserului este, de asemenea, încetinită din cauza incapacității de a construi complet AST din mers pe măsură ce codul este încărcat (browserul trebuie să aștepte ca blocurile de cod să finalizeze încărcarea, cum ar fi sfârșitul funcțiilor, pentru a obține informațiile care lipsesc pentru a analiza elementele curente).

Ei încearcă să rezolve parțial problema prin distribuirea codului într-o formă redusă și comprimată, precum și prin memorarea în cache a bytecode generat de browser. Pe site-urile moderne, codul este actualizat destul de des, așa că memorarea în cache rezolvă doar parțial problema. WebAssembly ar putea fi o soluție, dar necesită introducerea explicită a codului și nu este potrivit pentru accelerarea procesării codului JavaScript existent.

O altă opțiune este de a furniza coduri de octet compilate gata făcute în loc de scripturi JavaScript, dar dezvoltatorii de motoare de browser sunt împotrivă, deoarece codul de octet de la terți este dificil de verificat, procesarea lui directă poate duce la stratificarea Web, apar riscuri suplimentare de securitate și dezvoltarea este necesar un format de bytecode universal.

BinaryAST vă permite să vă încadrați în modelul actual de dezvoltare și livrare a codului fără a crea un nou bytecode sau a schimba limbajul JavaScript. Dimensiunea datelor în format BinaryAST este comparabilă cu codul JavaScript comprimat comprimat, iar viteza de procesare prin eliminarea fazei de analiză a textului sursă crește considerabil. În plus, formatul permite compilarea la bytecode pe măsură ce BinaryAST este încărcat, fără a aștepta finalizarea tuturor datelor. În plus, analizarea din partea serverului vă permite să excludeți funcțiile neutilizate și codul inutil din reprezentarea BinaryAST returnată, care, atunci când analizați din partea browserului, pierde timp atât analizând, cât și transmiterii traficului inutil.

O caracteristică a BinaryAST este, de asemenea, capacitatea de a restabili JavaScript lizibil, care nu este exact același cu versiunea originală, dar este echivalent din punct de vedere semantic și include aceleași nume de variabile și funcții (BinaryAST salvează nume, dar nu salvează informații despre pozițiile din cod, formatare și comentarii). Cealaltă parte a monedei este apariția de noi vectori de atac, dar, potrivit dezvoltatorilor, aceștia sunt mult mai mici și mai controlabili decât atunci când se folosesc alternative, cum ar fi distribuția bytecode.

Testele codului facebook.com au arătat că analizarea JavaScript consumă 10-15% din resursele CPU, iar analizarea necesită mai mult timp decât generarea codului octet și generarea inițială a codului pentru JIT. În motorul SpiderMonkey, timpul pentru a construi complet un AST durează 500-800 ms, iar utilizarea BinaryAST a redus această cifră cu 70-90%.
În general, pentru majoritatea artificiilor web, când se utilizează BinaryAST, timpul de analiză JavaScript este redus cu 3-10% în modul fără optimizare și cu 90-97% când modul de ignorare a funcțiilor neutilizate este activat.
Când rulați un set de testare JavaScript de 1.2 MB, utilizarea BinaryAST a permis ca timpul de pornire să fie accelerat de la 338 la 314 ms pe un sistem desktop (Intel i7) și de la 2019 la 1455 ms pe un dispozitiv mobil (HTC One M8).

Sursa: opennet.ru

Adauga un comentariu