Cloudflare, Mozilla и Facebook развиват BinaryAST за ускоряване на зареждането на JavaScript

Инженери от компаниите Cloudflare, Mozilla, Facebook и Bloomberg предложиха нов формат BinaryAST за ускорение на доставката и обработката на JavaScript код при отваряне на сайтове в браузъра. BinaryAST премества етапа на синтактичното разбиране на сървъра и предоставя вече формирано абстрактно синтактично дърво (AST). При получаване на BinaryAST браузърът може веднага да премине към етапа на компилация, пропускайки парсирането на изходния код на JavaScript.

За тестване е подготвена еталонна реализация, предоставена под лиценз MIT. За парсинга се използват компоненти на Node.js, а кодът за оптимизация и формиране на AST е написан на езика Rust. От страна на браузърите поддръжката на
BinaryAST вече е налична в нощни сборки Firefox. Кодерът в BinaryAST може да се прилага както на ниво инструменти за крайния сайт, така и за опаковане на скриптове от външни сайтове от страна на проксито или мрежата за доставка на съдържание. В момента вече е започнал процесът на стандартизация на BinaryAST от работната група ECMA TC39, след завършването на който форматът ще може да съществува заедно с настоящите методи за компресия на подаденото съдържание, като gzip и brotli.

Cloudflare, Mozilla и Facebook развиват BinaryAST за ускоряване на зареждането на JavaScript

Cloudflare, Mozilla и Facebook развиват BinaryAST за ускоряване на зареждането на JavaScript

Значителна част от времето при обработката на JavaScript заема етапът на зареждане и синтактично разбиране на кода. С оглед на факта, че обемът на зареждания JavaScript на много популярни сайтове приближава 10 Мб (например за LinkedIn — 7.2Мб, Facebook — 7.1Мб, Gmail — 3.9Мб), първоначалната обработка на JavaScript внася значителна забавяне. Етапът на парсиране от страна на браузъра също е забавен поради невъзможността за пълно построяване на AST в реално време, докато кодът се зарежда (бразъра трябва да изчака завършването на зареждането на блоковете код, например края на функциите, за да получи нужната информация за парсиране на текущите елементи).

Частично проблемът се опитват да решат чрез разпространение на кода в минимализиран и компресиран вид, както и с кеширане от браузъра на генерирания байткод. На съвременните сайтове кодът се обновява доста често, поради което кеширането само частично решава проблема. Изходът би могъл да бъде WebAssembly, но той изисква използване на явна типизация в кода и не е подходящ за ускоряване на обработката на вече съществуващия код на JavaScript.

Друг вариант е доставката на готов скомпилиран байткод вместо JavaScript-скриптов, но разработчиците на браузерните двигатели са против, тъй като външният байткод е труден за верификация, а директната му обработка може да доведе до разслояване на уеб, възникват допълнителни заплахи за сигурността и е необходимо разработването на формат за универсален байткод.

BinaryAST позволява интегрирането в текущата модел на разработка и доставка на код без необходимост от създаване на нов байткод и без изменение на JavaScript. Размерът на данните в формат BinaryAST е съпоставим с компресирания минифициран JavaScript-код, докато скоростта на обработка значително се увеличава благодарение на премахването на етапа на парсинг на изходните текстове. Освен това, форматът позволява компилация в байткод по време на зареждането на BinaryAST, без да се чака приключването на получаването на всички данни. Освен това, парсингът на страната на сървъра позволява изключването от представянето на BinaryAST неизползвани функции и ненужен код, за който при парсинг на страната на браузера се губи време както за анализ, така и за предаване на ненужен трафик.

Особеност на BinaryAST е също така възможността за възстановяване на четим JavaScript, който не съвпада един към един с оригиналната версия, но е семантично еквивалентен и включва същите имена на променливи и функции (BinaryAST запазва имената, но не запазва информация за позициите в кода, форматирането и коментарите). Обратната страна на медала е появата на нови вектори за атаки, но според разработчиците те са значително по-малко и по-контролируеми в сравнение с алтернативи, като разпространението на байткод.

Тестовете на кода на facebook.com показаха, че разпределението на JavaScript изразходва 10-15% от ресурсите на CPU и за парсинг се изразходва повече време, отколкото за генериране на байткод и начално формиране на код за JIT. В двигателя SpiderMonkey времето за пълно изграждане на AST отнема 500-800 мс и прилагането на BinaryAST позволи да се намали този показател с 70-90%.
Общо взето, за повечето web-фреймворкове при използване на BinaryAST времето за парсинг на JavaScript се съкращава с 3-10% в режим без оптимизация и с 90-97% при активиран режим на игнориране на неизползвани функции.
При тестирование на JavaScript набор с размер 1.2 Мб, използването на BinaryAST ускори времето за стартиране от 338 до 314 мс на настолен компютър (Intel i7) и от 2019 до 1455 мс на мобилно устройство (HTC One M8).

Източник: opennet.ru

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster