Zanbench : framework de test de performances

Zanbench est un framework opensource de test de performances ou "benchmark". Le design de zanbench s'inspire des framework xUnit. Le projet est hébergé sur google code et est actuellement en version 0.2. Dans cet article, je fais une brève introduction à ce qu'est un test de performance avant de vous orienter sur le démarrage rapide.

Pourquoi mesurer les performances ?

La mesure des performances, d'un système, d'un programme ou d'un algorithme est généralement liée à la volonté ou la nécessité d'optimiser le code. Je vous rapporte ici une citation que j'aime particulièrement concernant l'optimisation :

Règle 1: Ne pas optimiser.
Règle 2: Ne pas optimiser tant que nous n'avons pas de solutions parfaitement claire et non optimisée.
M. A. Jackson, Principles of Program Design

Toutefois, lorsque vient la phase d'optimisation d'un programme, nous sommes amenés à rechercher les noeuds de performances et à évaluer les différentes implémentations pouvant réduire les temps d'exécution. La mesure objective des performances d'un algorithme étant tributaire du système sur lequel il s'éxecute, on cherche généralement à mesurer sa vitesse d'exécution par rapport à un autre.

Lorsque l'on veut comparer la performance de tel ou tel autre algorithme, on est souvent contraint d'utiliser la méthode brute, à savoir mettre le code à tester dans une boucle for ou while et mesurer la différence de temps entre l'avant et l'après.

Un exemple de test de performance (benchmark) trivial, qui permet de comparer la performance de getTimer() par rapport à (new Date).time :

package simple
{
    import flash.display.Sprite;
    import flash.utils.getTimer;

    public class TimePerfTest extends Sprite
    {
        public function TimePerfTest()
        {
            measureGetTimer();
            measureDate();
        }

        public function measureGetTimer():void
        {
            var before:Number = getTimer();
            var whatTimeIsItPlease:Number;
            for (var i:int = 0;i < 1000000; i++)
            {
                whatTimeIsItPlease = getTimer();
            }
            var after:Number = getTimer();
            trace(after - before);//1469
        }

        public function measureDate():void
        {
            var before:Number = getTimer();
            var whatTimeIsItPlease:Number;
            for (var i:int = 0;i < 1000000; i++)
            {
                whatTimeIsItPlease = (new Date()).time;
            }
            var after:Number = getTimer();
            trace(after - before);//3728
        }
    }
}

Cette méthode, bien qu'efficace, présente plusieurs inconvénients. Tout d'abord, on peut vite se retrouver avec un block de code ayant un temps d'exécution supérieur à celui autorisé par le flashplayer, levant ainsi une erreur :

1502 Un script a été exécuté au-delà du délai d'expiration par défaut de 15 secondes

puis :

1503 Un script ne s'est pas arrêté après 30 secondes et a été arrêté.

Même si on évite ces erreurs en cassant la boucle entre plusieurs méthodes, il reste toujours le problème de l'usage des ressources systèmes. Une utilisation trop gourmande des ressources système, notamment processeur et mémoire vive, peut gravement nuire à la qualité des tests.

Si le système donne la priorité à un autre processus alors qu'il tourne à plein régime, les temps d'exécution de l'algorithme seront allongés de manière non représentative. De même, si le système se retrouve obligé de faire une lecture ou une écriture en mémoire virtuelle, du fait d'une utilisation trop importante de la mémoire vive par le flashplayer, les temps d'exécutions seront eux aussi affectés.

Effectuer des benchmarks crédibles demande donc de ménager le système, tout en répétant l'algorithme suffisamment de fois pour avoir un résultat représentatif. Finalement, cette dernière problématique peut aussi être contournée avec un peu de bon sens lors de l'écriture des tests, mais le code nécessaire devient vite redondant et difficile à maintenir.

Zanbench à pour objectif de permettre au développeur de s'abstraire du problème de l'écriture du test de performance, pour se focaliser sur le code à tester lui même. Quelques lignes de codes valant mieux qu'un long discours, rentrons dans le vif du sujet avec ce démarrage rapide.

Leave a comment

Comments