Vaut-il mieux utiliser super pour surcharger une méthode sans la modifier ? Abordant le sujet avec petepx et ekameleon, c'est bien ce que je croyais, mais piqué dans ma curiosité, j'ai entrepris de faire quelques benchs.

La question est donc : si je veux accéder à une méthode héritée, vaut-il mieux la surcharger, et appeler explicitement la méthode de la classe mère avec super, ou laisser faire la parcours de la chaine de prototypes ? J'ai tout d'abord cru que lui dire où aller était bien plus rapide, étant donné que la langage n'a alors pas besoin de le chercher par lui-même ...

Mais trève de discussions, voici les classes qui m'ont servi a faire mes benchs. J'ai bien fait attention à utiliser le même nombre de lettres pour les différentes classes de même niveau, car pour ceux qui ne le savent pas encore, dans Flash, plus les noms de variables sont courts, plus ils sont efficaces en terme de performances :/** Classe mère */
class CClass {
        private static var myProp:Number = 0;
        public function testMethod() {
                myProp++;
        }
}
/** Classe fille sans surcharge */
class CChild extends CClass {
}
/** Classe fille avec surcharge */
class SChild extends CClass {
        public function testMethod() {
                super.testMethod();
        }
}
/** Lancement des benchs */
var loop:Number = 50000;
var tim:Number;
// Sans super
trace("Sans super");
var o1:CChild = new CChild();
tim = getTimer();
for (var i=0 ; i<loop ; i++) {
        o1.testMethod();
}
trace("Temps : " + (getTimer()-tim) + "ms.");
// Avec super
var o2:SChild = new SChild();
trace("Avec super");
tim = getTimer();
for (var i=0 ; i<loop ; i++) {
        o2.testMethod();
}
trace("Temps : " + (getTimer()-tim) + "ms.");
La sortie de ce code n'a pas manqué de m'étonnerSans super Temps : 1204ms. (en moyenne entre 1175 et 1225) Avec super Temps : 1535ms. (en moyenne entre 1525 et 1550) Avec une génération supplémentaire, c'est encore plus prononcé. Alors que les performances sans super ne semblent pas très affectées, celle avec super se dégradent considérablement :/** 3ème génération sans super */
class CGrandChild extends CChild {
}
/** 3ème génération avec super */
class SGrandChild extends SChild {
        public function testMethod() {
                super.testMethod();
        }
}
/** Lancement des benchs */
var loop:Number = 50000;
var tim:Number;
// Sans super
trace("Sans super");
var o1:CGrandChild = new CGrandChild();
tim = getTimer();
for (var i=0 ; i<loop ; i++) {
        o1.testMethod();
}
trace("Temps : " + (getTimer()-tim) + "ms.");
// Avec super
var o2:SGrandChild = new SGrandChild();
trace("Avec super");
tim = getTimer();
for (var i=0 ; i<loop ; i++) {
        o2.testMethod();
}
trace("Temps : " + (getTimer()-tim) + "ms.");

La sortie est plus qu'éloquente :Sans super
Temps : 1285ms. (en moyenne entre 1275 et 1305)

Avec super
Temps : 1947ms. (en moyenne entre 1925 et 1950)

Donc, il vaut mieux laisser le soin à Flash de trouver la bonne méthode plutôt que de le lui indiquer clairement. Quel manque de reconnaissance !!! :mrgreen:

PS : Par la même occasion, j'ai découvert que super.super.testMethod() n'est pas autorisé ! Encore un des mystères de super ! ;)