Enxeñeiros de Cloudflare, Mozilla, Facebook e Bloomberg
Para probas
BinaryAST xa está dispoñible en
Ao procesar JavaScript, pásase unha cantidade significativa de tempo na fase de carga e análise do código. Tendo en conta que o volume de JavaScript descargado en moitos sitios populares é próximo aos 10 MB (por exemplo, para LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), o procesamento inicial de JavaScript introduce un atraso significativo. A fase de análise no lado do navegador tamén se ralentiza debido á incapacidade de construír completamente o AST sobre a marcha mentres se carga o código (o navegador ten que esperar a que os bloques de código completen a carga, como o final das funcións, para obter a información que falta para analizar os elementos actuais).
Están tentando resolver parcialmente o problema distribuíndo o código nunha forma minimizada e comprimida, así como almacenando en caché o bytecode xerado polo navegador. Nos sitios modernos, o código actualízase con bastante frecuencia, polo que o caché só soluciona parcialmente o problema. WebAssembly podería ser unha solución, pero require escribir explícitamente o código e non é moi axeitado para acelerar o procesamento do código JavaScript existente.
Outra opción é entregar un bytecode compilado listo en lugar de scripts JavaScript, pero os desenvolvedores de motores de navegador están en contra porque o bytecode de terceiros é difícil de verificar, o seu procesamento directo pode levar á estratificación web, a que xorden riscos adicionais de seguridade e o desenvolvemento de é necesario un formato de bytecode universal.
BinaryAST permíteche encaixar no teu modelo de desenvolvemento e entrega de código actual sen crear un novo bytecode nin cambiar a linguaxe JavaScript. O tamaño dos datos no formato BinaryAST é comparable ao código JavaScript minificado comprimido e a velocidade de procesamento ao eliminar a fase de análise do texto fonte aumenta notablemente. Ademais, o formato permite a compilación de bytecode a medida que se carga BinaryAST, sen esperar a que se completen todos os datos. Ademais, a análise no lado do servidor permítelle excluír funcións non utilizadas e código innecesario da representación de BinaryAST devolto, o que, ao analizar no lado do navegador, perde tempo tanto analizando como transmitindo tráfico innecesario.
Unha característica de BinaryAST tamén é a capacidade de restaurar JavaScript lexible que non é exactamente o mesmo que a versión orixinal, pero é semanticamente equivalente e inclúe os mesmos nomes de variables e funcións (BinaryAST garda nomes, pero non garda información sobre posicións no código, formato e comentarios). A outra cara da moeda é a aparición de novos vectores de ataque, pero segundo os desenvolvedores, son moito máis pequenos e controlables que cando se usan alternativas, como a distribución de bytecode.
As probas do código de facebook.com mostraron que a análise de JavaScript consome un 10-15% dos recursos da CPU e a análise leva máis tempo que a xeración de bytecode e a xeración de código inicial para JIT. No motor SpiderMonkey, o tempo para construír completamente un AST leva 500-800 ms, e o uso de BinaryAST reduciu esta cifra nun 70-90%.
En xeral, para a maioría dos fogos artificiais web, ao usar BinaryAST, o tempo de análise de JavaScript redúcese nun 3-10% no modo sen optimización e nun 90-97% cando o modo de ignorar funcións non utilizadas está activado.
Ao executar un conxunto de probas de JavaScript de 1.2 MB, o uso de BinaryAST permitiu que o tempo de inicio se acelerase de 338 a 314 ms nun sistema de escritorio (Intel i7) e de 2019 a 1455 ms nun dispositivo móbil (HTC One M8).
Fonte: opennet.ru