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