Cloudflare, Mozilla i Facebook opracowują BinaryAST, aby przyspieszyć ładowanie JavaScript

Inżynierowie z Cloudflare, Mozilla, Facebook i Bloomberg sugerowane nowy format BinarnyAST aby przyspieszyć dostarczanie i przetwarzanie kodu JavaScript podczas otwierania stron w przeglądarce. BinaryAST przenosi fazę analizowania na stronę serwera i dostarcza już wygenerowane abstrakcyjne drzewo składni (AST). Po otrzymaniu BinaryAST przeglądarka może natychmiast przejść do etapu kompilacji, z pominięciem analizy kodu źródłowego JavaScript.

Dla testów przygotowany implementacja referencyjna dostarczana na licencji MIT. Do parsowania wykorzystywane są komponenty Node.js, a kod optymalizacji i generowania AST napisany jest w języku Rust. Wsparcie po stronie przeglądarki
BinaryAST jest już dostępny w nocne budowanie Firefoksa. Kodera w BinaryAST można używać zarówno na poziomie narzędzi witryny końcowej, jak i do pakowania skryptów witryn zewnętrznych po stronie serwera proxy lub sieci dostarczania treści. Obecnie rozpoczął się już proces standaryzacji BinaryAST przez grupę roboczą ECMA TC39, po czym format będzie mógł współistnieć z istniejącymi metodami kompresji treści, takimi jak gzip i brotli.

Cloudflare, Mozilla i Facebook opracowują BinaryAST, aby przyspieszyć ładowanie JavaScript

Cloudflare, Mozilla i Facebook opracowują BinaryAST, aby przyspieszyć ładowanie JavaScript

Podczas przetwarzania JavaScript znaczna ilość czasu jest poświęcana na fazę ładowania i analizowania kodu. Biorąc pod uwagę, że ilość pobieranego JavaScriptu na wielu popularnych serwisach jest bliska 10 MB (np. dla LinkedIn – 7.2 MB, Facebook – 7.1 MB, Gmail – 3.9 MB), wstępne przetwarzanie JavaScriptu wprowadza znaczne opóźnienie. Etap analizowania po stronie przeglądarki jest również spowolniony ze względu na niemożność pełnego zbudowania AST na bieżąco podczas ładowania kodu (przeglądarka musi czekać na zakończenie ładowania bloków kodu, np. koniec funkcji, aby uzyskać brakujące informacje do analizy bieżących elementów).

Próbują częściowo rozwiązać problem, dystrybuując kod w postaci zminimalizowanej i skompresowanej, a także buforując wygenerowany kod bajtowy przez przeglądarkę. W nowoczesnych witrynach kod jest aktualizowany dość często, więc buforowanie tylko częściowo rozwiązuje problem. Rozwiązaniem może być WebAssembly, ale wymaga on jawnego wpisania kodu i nie nadaje się dobrze do przyspieszania przetwarzania istniejącego kodu JavaScript.

Inną opcją jest dostarczanie gotowego, skompilowanego kodu bajtowego zamiast skryptów JavaScript, ale twórcy silników przeglądarek są temu przeciwni, ponieważ kod bajtowy stron trzecich jest trudny do zweryfikowania, jego bezpośrednie przetwarzanie może prowadzić do rozwarstwienia sieci, powstają dodatkowe zagrożenia bezpieczeństwa i rozwój wymagany jest uniwersalny format kodu bajtowego.

BinaryAST pozwala dopasować się do Twojego obecnego modelu tworzenia i dostarczania kodu bez tworzenia nowego kodu bajtowego lub zmiany języka JavaScript. Rozmiar danych w formacie BinaryAST jest porównywalny ze skompresowanym, zminimalizowanym kodem JavaScript, a prędkość przetwarzania poprzez wyeliminowanie fazy analizowania tekstu źródłowego zauważalnie wzrasta. Ponadto format umożliwia kompilację do kodu bajtowego podczas ładowania BinaryAST, bez czekania na uzupełnienie wszystkich danych. Ponadto parsowanie po stronie serwera pozwala wykluczyć nieużywane funkcje i niepotrzebny kod ze zwracanej reprezentacji BinaryAST, co podczas analizowania po stronie przeglądarki marnuje czas zarówno na analizowanie, jak i przesyłanie niepotrzebnego ruchu.

Cechą BinaryAST jest także możliwość przywrócenia czytelnego JavaScriptu, który nie jest dokładnie taki sam jak wersja pierwotna, ale jest semantycznie równoważny i zawiera te same nazwy zmiennych i funkcji (BinaryAST zapisuje nazwy, ale nie zapisuje informacji o pozycjach w kod, formatowanie i komentarze). Drugą stroną medalu jest pojawienie się nowych wektorów ataków, jednak według twórców są one znacznie mniejsze i łatwiejsze do kontrolowania niż w przypadku stosowania alternatyw, takich jak dystrybucja kodu bajtowego.

Testy kodu facebook.com wykazały, że parsowanie JavaScriptu pochłania 10-15% zasobów procesora i zajmuje więcej czasu niż wygenerowanie kodu bajtowego i wstępne wygenerowanie kodu dla JIT. W silniku SpiderMonkey czas całkowitego zbudowania AST zajmuje 500–800 ms, a zastosowanie BinaryAST zmniejszyło ten wynik o 70–90%.
Ogólnie rzecz biorąc, w przypadku większości fajerwerków internetowych, podczas korzystania z BinaryAST, czas analizowania JavaScript zmniejsza się o 3-10% w trybie bez optymalizacji i o 90-97%, gdy włączony jest tryb ignorowania nieużywanych funkcji.
Podczas uruchamiania zestawu testowego JavaScript o wielkości 1.2 MB, użycie BinaryAST pozwoliło przyspieszyć czas uruchamiania z 338 do 314 ms na komputerze stacjonarnym (Intel i7) i z 2019 r. do 1455 ms na urządzeniu mobilnym (HTC One M8).

Źródło: opennet.ru

Dodaj komentarz