Obtenir des mesures de performance fiables pour de courts morceaux de code

J’essaie de profiler un ensemble de fonctions qui implémentent différentes versions du même algorithme de différentes manières. J’ai augmenté le nombre de fois que chaque fonction est exécutée, de sorte que le temps total passé dans une seule fonction est d’environ 1 minute (pour révéler les différences de performances).

Maintenant, exécuter plusieurs fois le test donne des résultats déconcertants. Il existe une énorme variabilité (+ – 50%) entre plusieurs exécutions de la même fonction, et déterminer quelle fonction est la plus rapide (ce qui est l’objective du test) est presque impossible à cause de cela.

Y a-t-il quelque chose de spécial dont je devrais m’occuper avant d’exécuter les tests, afin d’obtenir des mesures plus régulières? À défaut, lancez-vous le test plusieurs fois et calculez la moyenne de chaque fonction.

    Il y a beaucoup de choses à vérifier!

    Tout d’abord, assurez-vous que vos fonctions sont réellement liées au processeur. Si tel est le cas, assurez-vous que tous les modes de régulation du processeur, turbo et d’économie d’énergie sont désactivés (dans le BIOS) pour le test. Si vous rencontrez toujours des difficultés, essayez d’épingler votre processus sur un seul cœur. Désactivez l’hyper-threading aussi peut-être.

    Le but de tout cela est de vous assurer que votre code tourne à chaud sur un seul kernel sans trop d’interruption. Si vous êtes sous Linux, vous pouvez supprimer un seul kernel de la liste des cœurs disponibles du système d’exploitation et l’utiliser (afin d’éviter toute interférence sur ce kernel).

    Effectuer le test plusieurs fois est une bonne idée, mais l’utilisation de la moyenne (moyenne arithmétique) ne l’est pas. Utilisez plutôt la médiane ou le minimum ou une autre mesure qui ne sera pas influencée par les valeurs aberrantes. Habituellement, les longs tests occasionnels peuvent être entièrement supprimés (sauf si vous construisez un système en temps réel!).