lundi 30 septembre 2013

Optimisation dart2js

L’optimisation qui tire plus vite que son ombre
#dartlang #javascript #dart2js

+Kasper Lund a dévoilé la dernière optimisation du compilateur Dart vers JavaScript, dart2js. Cette optimisation a permit de gagner 13% de performance sur le benchmark Richards, grâce à une astuce découverte par +Nicolas Geoffray, un français de l’équipe Dart :)

Attention, l’explication est compliquée !
L’astuce concerne l’appel d‘une méthode qui a été inlinée dans le code JavaScript généré, sur un objet qui peut être null. Il est nécessaire d’ajouter une vérification pour avoir la bonne exception. Dans l’hypothèse où l’on connaît le type de l’objet o, l’appel Dart suivant :
  o.foo();
donnait en JavaScript :
  o.foo;  // Permet de vérifier la nullité de l’objet.
  <<contenu de la méthode inlinée>>

Ainsi, on obtenait la bonne exception si l’objet o était null donc tout allait bien. Sauf lorsque le tree shaking, qui a pour rôle d'enlever le code non appelé pour alléger le code généré, enlève la vrai méthode o.foo(). Le moteur JavaScript a horreur des propriétés qui n’existent pas sur un objet, ça ralenti l’évaluation de ce code. Du coup, au lieu de vérifier la nullité en vérifiant la méthode foo, on va vérifier sur une méthode qui existe dans tous les objet, à savoir, toString.
  o.toString;  // Permet de vérifier la nullité de l’objet.
  <<contenu de la méthode inlinée>>

Aucun commentaire:

Enregistrer un commentaire