En faisant diverses expériences aujourd'hui pour choisir une représentation objet efficace j'ai obtenu un résultat suprenant. En factorisant une opération objet dans une fonction globale (correspondant au mécanisme de cache présenté la semaine dernière), j'arrive à pratiquement doubler la vitesse d'exécution. Voici le code utilisé:
var o = { foo:1, ident:function (x) { return x; } }; var o2 = { __proto__:o, bar:2, };
codeCache0 = function ($this, $closure, name, value) { return ($this.foo = 1); }
(function () { var t = 0; var scale = 1000000; for (var i = 0; i < 200*scale; ++i) { //t += (o2.foo = 1); // Version 1 baseline t += codeCache0(o2, null, "", 1); // Version 2 ~2x faster!!! } print(t/scale); })();
En utilisant, l'option --trace_inlining, on peut voir que le code de codeCache0 est inliné au site d'appel. J'utilise la révision 7932 de V8 (la dernière révision est 12707). Si quelqu'un peut essayer de répliquer le résultat sur une autre version, ce serait intéressant.
L'utilisation d'une fonction anonyme comme environnement lexical est nécessaire. Si le code s'exécute dans l'environnement global la version 1 est 7x plus lente mais est tout de même plus rapide que la version 2 (autrement dit, la version 2 va être ralentie par un facteur plus élevé que la version 1).
Erick
Afficher les réponses par date