Voici l'une des approches que j'en.fais en 32 bits, mono-core.
Je zappe le poids fort (EDX) donc il y a risque de tomber tôt ou tard sur une valeur pharaonique que le compteur incrémente au niveau du poids fort tout en annulant le poids faible.
Ceci est donc une approche manuelle. Pour une approche automatique 32 bits, soit l'on rajoute une condition (Si négatif, refaire le test), soit l'on prend en charge le poids fort.
_TickStart et _TickStop sont à placer autour de la routine à mesurer. Ils ne se placent qu'en local.
tDelta est la variable qui contient le nombre de cycles entre _TickStart et _TickStop.
Code : Tout sélectionner
;{
Macro _TickStart
CompilerIf MacroExpandedCount - 1
Delay(0)
! RDTSC
! MOV [v_tIni], EAX
CompilerElse
Define tIni
CompilerEndIf
EndMacro
Macro _TickStop
CompilerIf MacroExpandedCount - 1
! RDTSC
! MOV [v_tFin], EAX
tDelta = tFin - tIni - tTare
CompilerElse
Define tFin
CompilerEndIf
EndMacro
Macro _TickInit
Delay(16)
CompilerIf MacroExpandedCount = 1
Define tTare.I
CompilerEndIf
_TickStart
_TickStop
_TickStart
_TickStop
tTare = tDelta
EndMacro
_TickInit
;}
Puis vous mesurez telle ou telle instruction ou routine comme ceci:
Code : Tout sélectionner
_TickStart
! xor eax, eax
_TickStop
Debug tDelta
A l'exception de "MacroExpandedCount" qui a été ajouté pour compacter les macros, cela fait 6 ans que je fais des mesures. C'est très intéressant. La première chose à constater, c'est le pipe-line (1 cycle par instruction non achevée).
Prochainement, je tâcherai de vous montrer une approche plus "terre à terre" de cette prise de mesure. J'attends d'éventuelles remarques.
Si mes souvenirs sont bons, et corrigez-moi si je me goure, c'est "tonton" qui m'a montré ce truc.