Des idées? La création de fermeture change la façon dont les variables locales sont stockées, voir le frame de la fonction anonyme au complet. Il see peut aussi que, comme tu semble suggérer, il y as du code dans la création de la première fermeture qui est le même pour la création de la 2e fermeture. Ce code là n'est peut-être pas éliminé si la première fermeture (hors de la boucle) n'existe pas. Essaie donc de mettre ta fermeture en commentaire dans la boucle aussi, voir si l'effet persiste.
Si tu veux une réponse plus exacte, fait sortir le code assembleur. Il y a un flag command-line pour ça. Ça se peut que tu doive compiler D8 avec des options différentes pour activer le désassembleur cependant.
- Max
Nouvel item dans la série "Étude de performance de V8". Le prochain exemple montre comment du code qui n'est fonctionnellement pas lié au comportement de la partie chaude d'un micro-benchmark peut en influencer la performance de manière significative. Dans l'exemple suivant, en activant la ligne en commentaire, on peut noter un gain de performance de plus de 7x. Cela ne fonctionne que lorsque la fonction f est une fermeture sur une des variables locales, peu importe laquelle.
(function () { var scale = 160000; var t = 0; var x = 1; var y;
// Uncomment the next line for a // >7x improvement in performance!!! //var f = (function () { return f; }); for (var i = 0; i < 200*scale; ++i) { y = (function (x) { return x; }); t += y(1); } print(t/scale);
})();
Mon hypothèse à ce point-ci c'est que la création de la fonction y à chaque tour de boucle peut réutiliser des éléments de la fonction f, autrement ils sont recréés à chaque tour de boucle.
Des idées pour isoler le phénomène et/ou pour l'expliquer?
Erick _______________________________________________ Dlteam-list mailing list Dlteam-list@iro.umontreal.ca https://webmail.iro.umontreal.ca/mailman/listinfo/dlteam-list