Cloudflare, Mozilla et Facebook développent BinaryAST pour accélérer le chargement de JavaScript

Ingénieurs de Cloudflare, Mozilla, Facebook et Bloomberg offert nouveau format BinaireAST pour accélérer la livraison et le traitement du code JavaScript lors de l'ouverture de sites dans un navigateur. BinaryAST déplace la phase d'analyse côté serveur et fournit un arbre de syntaxe abstraite déjà généré (AST). Dès réception d'un BinaryAST, le navigateur peut immédiatement passer à l'étape de compilation, en contournant l'analyse du code source JavaScript.

Pour tester préparé par implémentation de référence fournie sous licence MIT. Les composants Node.js sont utilisés pour l'analyse et le code d'optimisation et de génération AST est écrit en Rust. Prise en charge côté navigateur
BinaryAST est déjà disponible dans constructions nocturnes Firefox. L'encodeur de BinaryAST peut être utilisé à la fois au niveau des outils du site final et pour empaqueter des scripts de sites externes du côté d'un proxy ou d'un réseau de diffusion de contenu. Actuellement, le processus de normalisation de BinaryAST par le groupe de travail a déjà commencé ECMA TC39, après quoi le format pourra coexister avec les méthodes de compression de contenu existantes, telles que gzip et brotli.

Cloudflare, Mozilla et Facebook développent BinaryAST pour accélérer le chargement de JavaScript

Cloudflare, Mozilla et Facebook développent BinaryAST pour accélérer le chargement de JavaScript

Lors du traitement de JavaScript, une quantité importante de temps est consacrée à la phase de chargement et d'analyse du code. Considérant que le volume de JavaScript téléchargé sur de nombreux sites populaires est proche de 10 Mo (par exemple, pour LinkedIn - 7.2 Mo, Facebook - 7.1 Mo, Gmail - 3.9 Mo), le traitement initial de JavaScript introduit un retard important. L'étape d'analyse côté navigateur est également ralentie en raison de l'incapacité de construire entièrement l'AST à la volée lors du chargement du code (le navigateur doit attendre la fin du chargement des blocs de code, comme la fin des fonctions, pour obtenir les informations manquantes pour analyser les éléments courants).

Ils tentent de résoudre partiellement le problème en distribuant le code sous une forme réduite et compressée, ainsi qu'en mettant en cache le bytecode généré par le navigateur. Sur les sites modernes, le code est mis à jour assez souvent, donc la mise en cache ne résout que partiellement le problème. WebAssembly pourrait être une solution, mais il nécessite une saisie explicite du code et n'est pas bien adapté pour accélérer le traitement du code JavaScript existant.

Une autre option consiste à fournir un bytecode compilé prêt à l'emploi au lieu de scripts JavaScript, mais les développeurs de moteurs de navigateur s'y opposent car le bytecode tiers est difficile à vérifier, son traitement direct peut conduire à une stratification du Web, des risques de sécurité supplémentaires apparaissent et le développement de un format de bytecode universel est requis.

BinaryAST vous permet de vous adapter à votre modèle actuel de développement et de livraison de code sans créer de nouveau bytecode ni modifier le langage JavaScript. La taille des données au format BinaryAST est comparable à celle du code JavaScript minifié compressé, et la vitesse de traitement en éliminant la phase d'analyse du texte source augmente sensiblement. De plus, le format permet la compilation en bytecode au fur et à mesure du chargement de BinaryAST, sans attendre que toutes les données soient terminées. De plus, l'analyse côté serveur vous permet d'exclure les fonctions inutilisées et le code inutile de la représentation BinaryAST renvoyée, ce qui, lors de l'analyse côté navigateur, fait perdre du temps à l'analyse et à la transmission du trafic inutile.

Une fonctionnalité de BinaryAST est également la possibilité de restaurer du JavaScript lisible qui n'est pas exactement le même que la version originale, mais qui est sémantiquement équivalent et inclut les mêmes noms de variables et de fonctions (BinaryAST enregistre les noms, mais n'enregistre pas les informations sur les positions dans le fichier). code, formatage et commentaires). Le revers de la médaille est l'émergence de nouveaux vecteurs d'attaque, mais selon les développeurs, ils sont beaucoup plus petits et plus contrôlables que lorsqu'on utilise des alternatives, telles que la distribution de bytecode.

Les tests du code de Facebook.com ont montré que l'analyse de JavaScript consomme 10 à 15 % des ressources du processeur et que l'analyse prend plus de temps que la génération de bytecode et la génération initiale de code pour JIT. Dans le moteur SpiderMonkey, le temps nécessaire pour créer complètement un AST prend 500 à 800 ms, et l'utilisation de BinaryAST a réduit ce chiffre de 70 à 90 %.
En général, pour la plupart des feux d'artifice Web, lors de l'utilisation de BinaryAST, le temps d'analyse JavaScript est réduit de 3 à 10 % en mode sans optimisation et de 90 à 97 % lorsque le mode d'ignorance des fonctions inutilisées est activé.
Lors de l'exécution d'un ensemble de tests JavaScript de 1.2 Mo, l'utilisation de BinaryAST a permis au temps de démarrage d'accélérer de 338 à 314 ms sur un système de bureau (Intel i7) et de 2019 à 1455 8 ms sur un appareil mobile (HTC One MXNUMX).

Source: opennet.ru

Ajouter un commentaire