Ang Cloudflare, Mozilla at Facebook ay bumuo ng BinaryAST upang mapabilis ang pag-load ng JavaScript

Mga inhinyero mula sa Cloudflare, Mozilla, Facebook at Bloomberg inalok bagong format BinaryASTAST upang mapabilis ang paghahatid at pagproseso ng JavaScript code kapag nagbubukas ng mga site sa isang browser. Inililipat ng BinaryAST ang yugto ng pag-parse sa gilid ng server at nagbibigay ng nabuo nang abstract syntax tree (AST). Sa pagtanggap ng BinaryAST, maaaring magpatuloy kaagad ang browser sa yugto ng compilation, na lampasan ang pag-parse ng source code ng JavaScript.

Para sa pagsubok or pagsusuri pinaghandaan pagpapatupad ng reference na ibinigay sa ilalim ng lisensya ng MIT. Ginagamit ang mga bahagi ng Node.js para sa pag-parse, at ang code para sa pag-optimize at pagbuo ng AST ay nakasulat sa Rust. Suporta sa gilid ng browser
Available na ang BinaryAST sa gabi-gabi na pagtatayo Firefox. Ang encoder sa BinaryAST ay maaaring gamitin pareho sa end site tooling level at para sa mga script ng packaging ng mga external na site sa gilid ng isang proxy o network ng paghahatid ng nilalaman. Sa kasalukuyan, nagsimula na ang proseso ng standardisasyon ng BinaryAST ng working group ECMA TC39, pagkatapos kung saan ang format ay makakasama sa umiiral na mga paraan ng pag-compress ng nilalaman, gaya ng gzip at brotli.

Ang Cloudflare, Mozilla at Facebook ay bumuo ng BinaryAST upang mapabilis ang pag-load ng JavaScript

Ang Cloudflare, Mozilla at Facebook ay bumuo ng BinaryAST upang mapabilis ang pag-load ng JavaScript

Kapag nagpoproseso ng JavaScript, maraming oras ang ginugugol sa yugto ng paglo-load at pag-parse ng code. Isinasaalang-alang na ang dami ng na-download na JavaScript sa maraming sikat na site ay malapit sa 10 MB (halimbawa, para sa LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), ang paunang pagproseso ng JavaScript ay nagpapakilala ng isang makabuluhang pagkaantala. Ang yugto ng pag-parse sa gilid ng browser ay pinabagal din dahil sa kawalan ng kakayahang ganap na buuin ang AST sa mabilisang paglo-load ng code (kailangan ng browser na maghintay para sa mga bloke ng code upang makumpleto ang paglo-load, tulad ng pagtatapos ng mga function, upang makuha ang impormasyong nawawala para i-parse ang kasalukuyang mga elemento).

Sinusubukan nilang bahagyang lutasin ang problema sa pamamagitan ng pamamahagi ng code sa isang pinaliit at naka-compress na form, pati na rin sa pamamagitan ng pag-cache ng nabuong bytecode ng browser. Sa modernong mga site, ang code ay madalas na na-update, kaya ang pag-cache ay bahagyang nalulutas ang problema. Maaaring maging solusyon ang WebAssembly, ngunit nangangailangan ito ng tahasang pag-type sa code at hindi ito angkop para sa pagpapabilis ng pagproseso ng umiiral na JavaScript code.

Ang isa pang pagpipilian ay ang maghatid ng mga handa na compiled bytecode sa halip na mga script ng JavaScript, ngunit ang mga developer ng browser engine ay laban dito dahil ang third-party na bytecode ay mahirap i-verify, ang direktang pagproseso nito ay maaaring humantong sa Web stratification, mga karagdagang panganib sa seguridad, at pagbuo ng isang unibersal na bytecode na format ang kinakailangan.

Binibigyang-daan ka ng BinaryAST na magkasya sa iyong kasalukuyang modelo ng pagbuo ng code at paghahatid nang hindi gumagawa ng bagong bytecode o binabago ang wika ng JavaScript. Ang laki ng data sa BinaryAST na format ay maihahambing sa compressed minified JavaScript code, at ang bilis ng pagproseso sa pamamagitan ng pag-aalis sa source text parsing phase ay kapansin-pansing tumataas. Bilang karagdagan, pinapayagan ng format ang compilation sa bytecode habang nilo-load ang BinaryAST, nang hindi naghihintay na makumpleto ang lahat ng data. Bilang karagdagan, ang pag-parse sa gilid ng server ay nagpapahintulot sa iyo na ibukod ang mga hindi nagamit na function at hindi kinakailangang code mula sa binalik na representasyon ng BinaryAST, na, kapag nag-parse sa gilid ng browser, ay nag-aaksaya ng oras sa parehong pag-parse at pagpapadala ng hindi kinakailangang trapiko.

Ang isang tampok ng BinaryAST ay ang kakayahang ibalik ang nababasang JavaScript na hindi eksaktong kapareho ng orihinal na bersyon, ngunit katumbas ng semantiko at kasama ang parehong mga pangalan ng mga variable at function (Ang BinaryAST ay nagse-save ng mga pangalan, ngunit hindi nagse-save ng impormasyon tungkol sa mga posisyon sa code, pag-format at komento). Ang kabilang panig ng barya ay ang paglitaw ng mga bagong vector ng pag-atake, ngunit ayon sa mga developer, ang mga ito ay mas maliit at mas nakokontrol kaysa kapag gumagamit ng mga alternatibo, tulad ng pamamahagi ng bytecode.

Ang mga pagsubok sa facebook.com code ay nagpakita na ang pag-parse ng JavaScript ay gumagamit ng 10-15% ng mga mapagkukunan ng CPU at ang pag-parse ay tumatagal ng mas maraming oras kaysa sa pagbuo ng bytecode at paunang pagbuo ng code para sa JIT. Sa SpiderMonkey engine, ang oras upang ganap na bumuo ng isang AST ay tumatagal ng 500-800 ms, at ang paggamit ng BinaryAST ay nabawasan ang figure na ito ng 70-90%.
Sa pangkalahatan, para sa karamihan ng mga paputok sa web, kapag gumagamit ng BinaryAST, ang oras ng pag-parse ng JavaScript ay nababawasan ng 3-10% sa mode na walang pag-optimize at ng 90-97% kapag pinagana ang mode ng pagwawalang-bahala sa mga hindi nagamit na function.
Kapag nagpapatakbo ng 1.2 MB JavaScript test suite, ang paggamit ng BinaryAST ay nagbigay-daan sa oras ng pagsisimula na mapabilis mula 338 hanggang 314 ms sa isang desktop system (Intel i7) at mula 2019 hanggang 1455 ms sa isang mobile device (HTC One M8).

Pinagmulan: opennet.ru

Magdagdag ng komento