17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

482<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

Test de performance d’un algorithme<br />

def calcul(a):<br />

for i in range(10):<br />

a = a + 3<br />

return a<br />

if __name__ == '__main__':<br />

""" test des performances de calcul() """<br />

import timeit<br />

timer = timeit.Timer('calcul(12)', 'from __main__ import calcul')<br />

temps = timer.repeat()<br />

temps = min(temps)<br />

assert(temps < 4)<br />

Cette assertion n’est pas très précise, même si dans l’exemple repeat() est utilisée<br />

pour prendre le meilleur de trois mesures, car les résultats varient énormément en<br />

fonction des conditions d’exécution.<br />

De plus, les temps dépendent de la machine utilisée et le temps maximal accordé à<br />

un test peut être à revoir sur une machine moins puissante. Il est donc nécessaire de<br />

calibrer les tests en fonction des machines cibles du programme et d’insérer des<br />

plages de tolérance.<br />

Ceci étant dit, le test remplit bien son rôle de garde-fou : une erreur est déclenchée si<br />

le temps d’exécution d’un algorithme critique devient anormal.<br />

decorator timed<br />

Il existe des outils de mesure de performance ciblés comme pyUnitPerf, de Grig<br />

Gheorghiu (http://sourceforge.net/projects/pyunitperf) qui est une adaptation de l’outil<br />

Java JUnitPerf de Mike Clark, et qui se greffe sur une classe unittest.TestCase pour<br />

définir un temps maximum d’exécution pour la suite de tests définie dans la classe.<br />

Cette approche oblige cependant à ne définir qu’un nombre limité de tests dans la<br />

classe, voire un test unique, et nécessite en outre d’ajouter du code spécifique pour sa<br />

mise en place.<br />

Le seul objectif des tests de performance ciblés étant de signaler qu’un test unitaire<br />

particulier dépasse un temps maximum autorisé, une autre approche plus légère est<br />

de concevoir un decorator.<br />

Le decorator présenté ci-contre fonctionne sur une unité pystone. Les pystones,<br />

fournis par le module test.pystone mesurent les performances de la machine et permettent<br />

de rendre tous les tests de performance portables : on ne mesure plus dans ce<br />

cas la durée d’exécution du code en secondes mais en pystones (Ps).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!