Cloudflare, Mozilla un Facebook attīsta BinaryAST, lai paātrinātu JavaScript ielādi

Inžinieri no Cloudflare, Mozilla, Facebook un Bloomberg ir ieteikuši jauns formāts BinaryAST lai paātrinātu JavaScript koda piegādi un apstrādi, atverot vietnes pārlūkprogrammā. BinaryAST pārvieto sintakses analīzes fāzi uz serveri un piegādā jau izveidotu abstrakto sintakses koku (AST). Saņemot BinaryAST, pārlūkprogramma var tieši pāriet uz kompilācijas posmu, apejot JavaScript avota koda parsēšanu.

Testēšanai sagatavota atsauces īstenojums, kas tiek piegādāts ar MIT licenci. Parsēšanai tiek izmantoti Node.js komponenti, savukārt kods AST optimizēšanai un veidošanai ir rakstīts valodā Rust. Pārlūkprogrammu pusē atbalsts
BinaryAST jau ir pieejams nakts būvēs Firefox. BinaryAST kodētājs var tikt izmantots gan beigu vietnes rīkjoslā, gan ārējo vietņu skriptu iepakošanai, izmantojot starpserveri vai satura piegādes tīklu. Pašlaik BinaryAST standartizācija jau ir sākušās darba grupā ECMA TC39, pēc kuras pabeigšanas formāts varēs līdzālt dzīvot ar pastāvošajām satura saspiešanas metodēm, piemēram, gzip un brotli.

Cloudflare, Mozilla un Facebook attīsta BinaryAST, lai paātrinātu JavaScript ielādi

Cloudflare, Mozilla un Facebook attīsta BinaryAST, lai paātrinātu JavaScript ielādi

Significanta laika daļa, apstrādājot JavaScript, tiek patērēta koda ielādēšanas un sintakses analīzes fāzē. Ņemot vērā, ka populārākajās vietnēs lejupielādējamā JavaScript apjoms tuvojas 10 MB (piemēram, LinkedIn — 7.2MB, Facebook — 7.1MB, Gmail — 3.9MB), sākotnējā JavaScript apstrāde rada ievērojamu aizturi. Parsēšanas posms pārlūkprogrammas pusē arī palēninās, jo nav iespējams izveidot AST uzreiz, kad kods tiek ielādēts (pārlūkprogramma ir spiesta gaidīt, līdz koda bloku ielādēšana ir pabeigta, piemēram, līdz funkciju noslēgumam, lai iegūtu trūkstošo informāciju pašreizējai elementu analīzei).

Daļēji problēmu cenšas atrisināt, izplatot kodu minimizētā un saspiestā veidā, kā arī izmantojot pārlūkprogrammas ģenerētā bajtkoda kešatmiņu. Mūsdienu vietnēs kods tiek regulāri atjaunināts, tāpēc kešatmiņa daļēji atrisina problēmu. Izeja varētu būt WebAssembly, bet tam ir nepieciešama skaidra tipu izmantošana kodā un tas nav labs risinājums, lai paātrinātu jau esošā JavaScript koda apstrādi.

Cits variants ir piegādāt gatavu kompilētu bajtkodu tā vietā, lai izmantotu JavaScript skriptus, taču pārlūkprogrammu dzinēju izstrādātāji iebilst, jo trešās puses bajtkodu ir grūti verificēt, un tā tieša apstrāde var novest pie Web slāņošanās, rodas papildu drošības draudi un ir nepieciešams izstrādāt universāla bajtkoda formātu.

BinaryAST ļauj iekļauties esošajā koda izstrādes un piegādes modelī bez jauna bajtkoda radīšanas un bez JavaScript valodas maiņas. Datu apjoms BinaryAST formātā ir salīdzināms ar saspiestu minificētu JavaScript kodu, un apstrādes ātrums palielinās, izslēdzot avota tekstu parsēšanas fāzi. Turklāt formāts ļauj veikt kompilāciju bajtkodā, kad BinaryAST tiek ielādēts, negaidot visu datu saņemšanu. Turklāt servera pusē notiekošā parsēšana ļauj izslēgt no nodotā BinaryAST attēla netiek izmantotas funkcijas un lieko kodu, kas, parsējot pārlūkprogrammā, patērē laiku gan analīzei, gan liekā trafika pārsūtīšanai.

BinaryAST raksturīgā iezīme ir arī iespēja atjaunot lasāmu JavaScript, kas precīzi nesakrīt ar sākotnējo variantu, bet ir semantiski ekvivalents un ietver tos pašus mainīgo un funkciju nosaukumus (BinaryAST saglabā nosaukumus, bet nesaglabā informāciju par koda pozīcijām, formatējumu un komentāriem). Monētas otra puse ir jaunu uzbrukumu vektoru parādīšanās, bet, kā uzskata izstrādātāji, tie ir ievērojami mazāki un vēl kontrolējami nekā alternatīvu lietošanas gadījumā, piemēram, bajtkoda izplatīšanas gadījumā.

Testi kodam facebook.com parādīja, ka JavaScript parsēšanai tiek patērēti 10-15% CPU resursu un parsēšanai nepieciešams vairāk laika nekā bajtkoda ģenerēšanai un sākotnējā koda izveidei JIT. SpiderMonkey motorā pilnīgas AST izveides laiks ir 500-800 ms, un BinaryAST izmantošana ļāva samazināt šo rādītāju par 70-90%.
Kopumā lielākajai daļai web ietvaru, izmantojot BinaryAST, JavaScript parsēšanas laiks tiek samazināts par 3-10% bez optimizācijas režīmā un par 90-97%, aktivizējot neizmantoto funkciju ignorēšanas režīmu.
Izpildot testēšanas JavaScript komplektu, kura lielums ir 1.2 MB, BinaryAST izmantošana ļāva samazināt palaišanas laiku no 338 līdz 314 ms uz galddatoru (Intel i7) un no 2019 līdz 1455 ms uz mobilajām ierīcēm (HTC One M8).

Avots: opennet.lv

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster