De nombreux articles sur la toile abordent les optimisations que l'on peut mettre en place en AS3 pour remplacer avantageusement certaines fonctions, comme certaines méthodes de la classe Math, par des équivalent plus rapides.

Concernant les maths, les points abordés sont souvent autour du floor() et du ceil(), de la multiplication et division de puissances de 2, et du modulo.

Mais rares sont les articles qui parlent de l'arrondi, à savoir le Math.round();

Voici donc ma petite contribution.

Le but : remplacer le Math.round() natif par un équivalent plus rapide tout en conservant sont comportement.

Deux cas se présentent :

- nombres positifs :

Ici trois solutions existent, elles font toutes la même chose et dans le même temps (les opérateurs binaires ne sont qu'à peine 1% plus rapide, autant dire que l'augmentation de perfs est négligeable).

  • solution 1 : var foo1:int = int(value + 0.5);
  • solution 2 : var foo2:int = value + 0.5 >> 0;
  • solution 3 : var foo3:int = value + 0.5 | 0; (ma préférée, que j'abrège en value+.5|0)

Comparons les perfs (10 000 000 itérations):

  • Math.round() natif : 358.2ms
  • solution 1, 2 ou 3 : 25.6ms

On obtient donc une fonction presque 14 fois plus rapide que le Math.round() natif.

- nombre négatifs (et positifs, le vrai équivalent au Math.round() en somme):

Ici aussi trois solutions existent, elles font toutes la même chose et dans le même temps (les opérateurs binaires ne sont qu'à peine 1% plus rapide, autant dire que l'augmentation de perf est négligeable).

  • solution 1 : var foo1:int = a>0 ? int(value + 0.5) : int(value - 0.5);
  • solution 2 : var foo2:int = a>0 ? value + 0.5 >> 0;
  • solution 3 : var foo3:int = a>0 ? value + 0.5 | 0; (ma préférée, que j'abrège en a>0?value+.5|0:value-.5|0)

Comparons les perfs (10 000 000 itérations):

  • Math.round() natif : 364.2ms
  • solution 1, 2 ou 3 : 139.6ms

On obtient donc une fonction d'arrondi exactement comme Math.round(), mais 2.6 fois plus rapide que le Math.round() natif.

Voila de quoi optimiser vos codes...

Mais attention, ces optimisations n'ont de sens que si elles sont utilisées dans une grosse boucle ou un traitement très complexe : pour un simple renderer, aucun intérêt, un Math.round() fera l'affaire, ou un toFixed() pour obtenir directement une String.