• # Des choux et des carottes...

    Posté par (site web personnel) . En réponse au lien Performance comparison: counting words in Python, Go, C++, C, AWK, Forth, and Rust. Évalué à 4.

    Pour prendre le langage que je connais le mieux, PHP, j'ai zieuté vite fait le code proposé, et qui est plutôt court :
    ```
    <?php
    $words = [];
    while (($line = fgets(STDIN)) !== false) {
    foreach (preg_split('/ +/', strtolower(trim($line)), -1, PREG_SPLIT_NO_EMPTY) as $word) {
    if (!isset($words[$word])) {
    $words[$word] = 0;
    }
    $words[$word]++;
    }
    }

    arsort($words);

    foreach($words as $word => $count) {
    echo "$word $count\n";
    }
    ```
    Il y a moyen de faire rapido plus court et plus rapide d'environ 30 ou 40% (j'y reviens plus bas) :

    while (($line = fgets(STDIN)) !== false) {
     foreach (explode(" ", strtolower(trim($line))) as $word) {
     @$words[$word]++;
     }
    }
    unset($words[""]);
    arsort($words);
    foreach($words as $word => $count) echo "$word $count\n";
    

    Certes c'est moins "propre" : pas bien de ne pas déclarer le tableau (auto en PHP non-strict), peut-être moins clair de ne pas initialiser à 0 l'élément du tableau (auto en PHP), et encore moins d'utiliser l'arobase pour faire tomber aux oubliettes le warning sur l'élément non-déclaré. Mais c'est un test de performance, non ? Même résultat en plus rapide.

    Ce "plus rapide" est difficile à estimer car sur ma machine, qui n'est pourtant pas de première jeunesse, le script PHP d'origine s'exécute en 0.19s (en moyenne), et la version modifiée en 0.11s (en moyenne aussi). En moyenne car d'un lancement à l'autre ça fluctue beaucoup (de 0.03s environ).

    Bref, comparer des langages alors que de toutes petites modifs comme celle que j'ai faites peuvent faire passer le résultat presque du simple au double (ou l'inverse), ça ne veut plus dire grand chose.
    Il faudrait retirer la partie "sortie standard" du calcul de temps d'exécution car les buffers de sorties des consoles (xfce4-terminal dans mon cas) doivent influencer pas mal le résultat ; et partir sur un jeu d'entrée beaucoup plus gros pour allonger le temps de traitement (viser au moins 30s) pour voir réellement des différences.