1 minute

En une minute : Démystification de la performance de ++i

Flattr this!

Aujourd'hui, j'ai décidé de m'attaquer au mythe que ++i serait plus performant que i++.

Une histoire d'allocation de variable en mémoire tampon qui ferait que i++ retourne la valeur de i avant l'affectation alors que ++i retourne directement la nouvelle valeur. Traduction codée :

var i = 42;
console.log(i++); // 42
console.log(i); // 43

i = 42;
console.log(++i); // 43
console.log(i); // 43

Vous saisissez mieux ?

Et bien, hormis sur Chrome 31 où il y a une différence de 10% (environ) en faveur de i++, les résultats pour tous les navigateurs sont similaires. Aucun des deux n'est notablement plus rapides que l'autre.

Rien ne justifie donc de changer votre façon de coder sur ce point. Rumeur infondée en JS à priori.

Les résultats des tests sur lesquels je m'appuie sont disponible à tous sur JSPerf : http://jsperf.com/increment-an-integer

Flattr this!

A propos de Mathieu

Ingénieur développeur web dans la vente par correspondance B2B, adepte de nouvelles technologies et d'innovation. Vous pouvez aussi me retrouver sur Twitter @mathrobin
Cette entrée a été publiée dans En une minute, avec comme mot(s)-clef(s) , . Vous pouvez la mettre en favoris avec ce permalien.
  • http://blog.mageekbox.net mageekguy

    De toute façon, décider d’utiliser ++i à la place de i++ juste en se basant sur la performance est stupide.
    La seule raison valable pour utiliser ++i à la place de i++, c’est que la variable doit effectivement obligatoirement être incrémentée avant d’être utilisée.
    C’est donc l’algorithme mis en œuvre qui détermine le formalisme qui doit être utilisé, et absolument rien d’autre.
    Tout le reste n’est que pignolage sans aucun intérêt.

    • http://www.mathieurobin.com/ Mathieu

      On est d’accord. J’ai songé à ce sujet parce que je lisais un document sur la conception basée sur la performance et ce conseil y était référencé, j’ai voulu vérifier l’information. L’algorithmique doit être prioritaire.

    • mugen

      +1

  • http://rgug.ch Raf

    Il y a un point où cela peut-être utile:
    Dans le cas des boucles for parmis les plus répandues on a un for( ; ; i++ ) et dans ce cas, le ++i ou i++ ne change rien à l’algo alors autant utiliser le plus rapide…

    • http://www.mathieurobin.com/ Mathieu

      Admettons (même si je n’ai jamais fait ça), ici le but était de montrer qu’à part une ou deux versions de navigateurs, il n’y pas de différence de perfos en JS. Mais ta remarque reste vraie, quand ça ne change rien à l’algo, autant utiliser la forme optimale, quand elle existe 😉

  • syndrael

    La conception basée sur la performance est une ligne directrice utile dans 1% des sites dans le monde, pourquoi ?
    1. Avant d’optimiser ton code, apprends déjà à coder. Une minimum de savoir en algorithmie permet des perfs visibles et surtout un code lisible.. leur développeur aussi doit être performant 😉
    2. Fais le tour des données à gérer et vois déjà si elles sont organisées de façon pertinente. Quand on voit des sites qui font des requêtes SQL avec 50 jointures sans index, sans requete préparée, sans procédure stockée, sans vue (ok c’est pour la compréhension pas les perfs) sans système de cache et j’en passe, y’a de quoi sourire quand on optimise trois lignes..
    3. Quel gain pour une optimisation ? 1 micro seconde ?? Super, tu as juste 1000 visites par jour quelle réussite !!
    ..enfin bref, je pourrais épiloguer pendant des heures à ce sujet. Tout ça pour dire qu’il y a des priorités quand on code et elles sont dictées par l’utilité et l’audience du site avant tout.
    Le but est avant tout de sortir un site fonctionnel, ergonomique et simple. Les améliorations en matière de perfs seront utiles si des lenteurs se font sentir ou si les serveurs tendent à être à la ramasse..
    Sur ce, bonne année et bon code !!!

    • http://www.mathieurobin.com MathRobin

      On est d’accord que si on veut améliorer la performance, il y a plus intéressant pour démarrer. Juste que c’est un point sur lequel on m’a déjà pas mal fait chier en revue. Je voulais donc juste le clarifier une bonne fois pour toutes.
      Bonne année aussi :-)

      • syndrael

        Celui qui t’a saoulé n’avait surement que ça à faire. D’autnat qu’avant d’avancer ce capillotractage il pourrait faire des tests.. ou alors reprendre des cours d’assembleurs, ça passe le temps ce genre de gymnastique cérébrale. 😉

        • http://www.mathieurobin.com/ Mathieu

          Un de mes profs de code… Je sais plus qu’elle était sa spécialité précise mais là dessus il avait tort 😉

  • Nicolas

    Constructif ! :)

Articles liés