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 MB (например за LinkedIn — 7.2MB, Facebook — 7.1MB, Gmail — 3.9MB), първичната обработка на JavaScript внася съществени забавяния. Етапът на парсинга от страна на браузъра също се забавя поради невъзможността за пълно построяване на AST на лето, при зареждането на кода (браузърът трябва да изчака завършването на зареждането на кодовите блокове, например края на функциите, за да получи липсващата информация за разбиране на текущите елементи).

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

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

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

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

Тестовете на кода на facebook.com показаха, че за парсирането на JavaScript се изразходват 10-15% от ресурсите на CPU и за парсиране се изразходва повече време, отколкото за генериране на байткода и начално формиране на кода за JIT. В енджина SpiderMonkey времето за пълно изграждане на AST отнема 500-800 мс и прилагането на BinaryAST позволи да се намали този показател с 70-90%.
В обобщение, за повечето web-frameworks при прилагане на 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