La classe profiler a une constante 'codée en dur' qui est ajoutée à chaque temps de manipulation des événements pour compenser les surcharges dues aux appels de la fonction temps et au rangement du résultat. La procédure suivante peut ëtre utilisée pour obtenir cette constante pour une plateforme donnée (voir la discussion dans la section Limitations ci-dessus).
import profile pr = profile.Profile() print pr.calibrate(100) print pr.calibrate(100) print pr.calibrate(100)
L'argument de calibrate() est le nombre de tests d'appels type au temps CPU. Si votre ordinateur est trés rapide, vous pourriez faire:
pr.calibrate(1000)
où mëme:
pr.calibrate(10000)
L'objet de cet exercice est d'obtenir un résultat assez cohérent. Quand vous avez une réponse cohérente, vous ëtes prët pour utiliser ce nombre dans votre code source. Pour une Sun Sparcstation 1000 sous Solaris 2.3, le nombre magique est environ .00053. Si vous avez le choix, vous vous en tirerez mieux avec une constante plus petite, et vos résultats apparaîtront ``moins souvent'' négatifs dans les statistiques de profil.
L'exemple qui suit montre comment on doit modifier la méthode trace_dispatch() de la classe Profile pour installer la constante de calibration sur une Sun Sparcstation 1000:
def trace_dispatch(self, frame, event, arg):
t = self.timer()
t = t[0] + t[1] - self.t - .00053 # Constante de calibration
if self.dispatch[event](frame,t):
t = self.timer()
self.t = t[0] + t[1]
else:
r = self.timer()
self.t = r[0] + r[1] - t # retard non enregistré
return
On notera que s'il n'y a pas de constante de calibration, alors la ligne contenant la constante de calibration s'écrit:
t = t[0] + t[1] - self.t # pas de constante de calibration
Vous pouvez obtenir le mëme résultat en utilisant une classe dérivée (et le profileur s'exécutera vraiment aussi rapidement !!), mais la méthode ci-dessus est la plus simple à utiliser. J'aurai pu faire un profileur ``s'auto calibrant'', mais cela aurait entrainé une initialisation plus lente de la classe profileur, et aurait nécessité une programmation trés originale, ou sinon l'utilisation d'une variable là où la constante ".00053"a été placée dans le code montré plus haut. Ceci est une TRES critiquable baisse de performances, et il n'y a pas de raison mettre en oeuvre, en ce point, un traitement de variable , quand une constante peut ëtre utilisée.