[ASM]Comment afficher la durée d'éxécution d'un programme en asm?

Comment afficher la durée d'éxécution d'un programme en asm? [ASM] - ASM - Programmation

Marsh Posté le 18-03-2004 à 18:41:39    

Bonjour,
 
Je suis en train de faire un programme qui demande des saisies et éffectue diverses opérations, j'aimerais retourner la durée d'éxécution de ce programme. Comment faire? je n'ai pas d'idées.
 
 
Merci

Reply

Marsh Posté le 18-03-2004 à 18:41:39   

Reply

Marsh Posté le 18-03-2004 à 21:32:54    

upla

Reply

Marsh Posté le 19-03-2004 à 01:21:06    

OS ?

Reply

Marsh Posté le 19-03-2004 à 08:14:25    

c'est de l'asm 80x86 sous windows xp (pkoi tu as besoin de connaitre l'os?)

Reply

Marsh Posté le 19-03-2004 à 11:52:24    

savoir ce que tu as le droit de faire, et le mode de fonctionnement du CPU.
 
le mieux c'est de passer par l'API QueryPerformanceCounter/QueryPerformanceFrequency, ou GetTickCount...

Reply

Marsh Posté le 19-03-2004 à 12:26:54    

sinon t'utilises RDTSC pour connaitre le nombre de cycles, et tu fais une règle de 3 en fonction de la puissance de ton processeur :D
exemple : un programme bouffe 400 000 cycles (via RDTSC) sur un processeur à 133 Mhz (133 000 000 de cycles par seconde)
=> temps passé en secondes = 400 000 / 133 000 000 = 0.03 secondes
 
OK je sors
[:neowen]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-03-2004 à 12:47:01    

non tu sors, parcequ'il faut être en ring 0 pour utiliser RDTSC sous un noyau NT, donc tu peux pas sous un process win32.  :whistle: (je vérifies dans le doute :D)
 
---- autant pour moi y'a pas de problème de ring 0 (donc c'est moi qui sors  :whistle:  :jap: )


Message édité par bjone le 19-03-2004 à 12:54:45
Reply

Marsh Posté le 19-03-2004 à 13:21:14    

prendre le temps consacré à ton processus me semble la meilleure solution :jap: (GetProcessTimes)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 19-03-2004 à 13:32:30    

mais je voudrais calculer cette durée en asm dans le prog lui même.

Reply

Marsh Posté le 19-03-2004 à 13:42:21    

si tu veux savoir combien de temps prend ton programme pour s'exécuter, soit tu te tapes la doc pour savoir combien de cycle prennent les instructions, soit tu demandes à Windows combien de temps il a consacré à ton programme, avec GetProcessTimes. Tu fais quelques appels API Win32 pour d'abord identifier ton process, puis savoir combien de temps il a passé sur le CPU. Rien t'empêche de le faire en ASM mais ces appels me semblent un passage obligé. Ensuite, tu interprêtes les données reçues en ASM :D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 19-03-2004 à 13:42:21   

Reply

Marsh Posté le 19-03-2004 à 23:14:12    

jijiz a écrit :

mais je voudrais calculer cette durée en asm dans le prog lui même.


ben c'est comme je t'ai dit, t'as qu'a utiliser RDTSC
exemple :

Code :
  1. push edx
  2. push eax
  3. rdtsc   // récupère le nbre de cycles depuis le dernier rdtsc dans edx:eax
  4. push eax   // sauvegarde le nb de cycles
  5. [...]   // ton programme
  6. rdtsc   // nb de cycles depuis le rdtsc précédent
  7. pop edx // récupère le nb de cycles précédent
  8. sub eax,edx // soustrait le nb de cycles actuels et le nb de cycles précédent


résultat : dans eax, tu as le nombre de cycles utilisés par ton programme, il ne te reste plus qu'a utiliser la méthode que je t'ai donné plus haut en fonction de la vitesse de ton processeur pour calculer le temps


Message édité par Harkonnen le 19-03-2004 à 23:32:49

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-03-2004 à 23:15:04    

drasche a écrit :

si tu veux savoir combien de temps prend ton programme pour s'exécuter, soit tu te tapes la doc pour savoir combien de cycle prennent les instructions,


rdtsc roulaize :o


Message édité par Harkonnen le 19-03-2004 à 23:15:21

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-03-2004 à 23:20:49    

Harkonnen a écrit :

sinon t'utilises RDTSC pour connaitre le nombre de cycles, et tu fais une règle de 3 en fonction de la puissance de ton processeur :D
exemple : un programme bouffe 400 000 cycles (via RDTSC) sur un processeur à 133 Mhz (133 000 000 de cycles par seconde)
=> temps passé en secondes = 400 000 / 133 000 000 = 0.03 secondes
 
OK je sors
[:neowen]

J'y connais rien en ASM et j'ai aucune idée de ce que veut dire RDTSC, mais ta méthode suppose que ton prog est le seul processus à s'éxécuter sur la machine, non ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 19-03-2004 à 23:21:16    

Harkonnen a écrit :

rdtsc roulaize :o


ouais mais sous Win.... si son process est mis en pause le temps qu'une autre tâche s'exécute, il fait quoi?
 
edit: brillamment grillé par R3g [:poischich]


Message édité par drasche le 19-03-2004 à 23:21:54

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 19-03-2004 à 23:30:56    

rdtsc ne concerne que le processus dans lequel il est lancé, c'est une instruction très bas niveau, les résultats obtenus ne sont valables que pour son propre processus.
il suffit de faire un test tout con pour s'en rendre compte : encadrer un bloc asm avec 2 rdtsc, le lancer sous différentes configurations, et on se rend compte qu'on obtient toujours peu ou prou la même chose


Message édité par Harkonnen le 19-03-2004 à 23:31:34

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-03-2004 à 23:32:10    

bjone a écrit :

non tu sors, parcequ'il faut être en ring 0 pour utiliser RDTSC sous un noyau NT, donc tu peux pas sous un process win32.  :whistle: (je vérifies dans le doute :D)
 
---- autant pour moi y'a pas de problème de ring 0 (donc c'est moi qui sors  :whistle:  :jap: )


c'est bien ce qu'il me semblait, je l'utilise sans souci sous XP :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-03-2004 à 23:32:17    

Harkonnen a écrit :

rdtsc ne concerne que le processus dans lequel il est lancé, c'est une instruction très bas niveau, les résultats obtenus ne sont valables que pour son propre processus.
il suffit de faire un test tout con pour s'en rendre compte : encadrer un bloc asm avec 2 rdtsc, le lancer sous différentes configurations, et on se rend compte qu'on obtient toujours peu ou prou la même chose

Donc ta méthode permet d'obtenir le temps d'utilisation CPU, mais je crois que ce que demandais jijiz c'est le temps d'execution du prog.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 19-03-2004 à 23:35:28    

R3g a écrit :

Donc ta méthode permet d'obtenir le temps d'utilisation CPU, mais je crois que ce que demandais jijiz c'est le temps d'execution du prog.


ma méthode permet d'obtenir le nombre de cycles pris par un groupe d'instructions.
sachant que la fréquence d'un processeur signifie le nombre de cycles qu'il est capable de traiter en une seconde, il suffit juste :
- d'encadrer tout le programme par 2 rdtsc,
- et une fois qu'on a le nombre de cycles total du prog, le diviser par le nombre total de cycles traitables par le processeur en une seconde (1 000 000 000 pour un processeur à 1 Ghz par exemple), pour obtenir le temps d'éxécution du prog en secondes [:sinclaire]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-03-2004 à 01:20:28    

l'approche rdtsc permet d'avoir une mesure temporelle à la précision de l'horloge cpu, ce que aucuns timers matériels permettent de faire...
 
mais attention à RDTSC: la fréquence d'horloge CPU étant variable, la mesure peut être faussée (ie overclocking à la mano par un utilitaire, ou changement de fréquence automatique pour les portables)

Reply

Marsh Posté le 20-03-2004 à 12:01:38    

bjone a écrit :

l'approche rdtsc permet d'avoir une mesure temporelle à la précision de l'horloge cpu, ce que aucuns timers matériels permettent de faire...
 
mais attention à RDTSC: la fréquence d'horloge CPU étant variable, la mesure peut être faussée (ie overclocking à la mano par un utilitaire, ou changement de fréquence automatique pour les portables)


:jap: :jap:
finalement, mon idée de départ était pas si con :D


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-03-2004 à 12:37:26    

wai j'y avais pensé, mais j'étais persuadé qu'on avait pas les droits de le faire à cause du niveau de privilège, ptet passke quand j'avais essayé a un moment, j'avais d'autres trucs qui passaient sous W9x et pu sous un noyau NT :D

Reply

Marsh Posté le 20-03-2004 à 15:53:18    

Beaucoup de gens font encore de l'assembleur sous windows ?

Reply

Marsh Posté le 20-03-2004 à 19:44:56    

manu025 a écrit :

Beaucoup de gens font encore de l'assembleur sous windows ?


Y'a au moins moi :D


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-03-2004 à 20:43:44    

manu025 a écrit :

Beaucoup de gens font encore de l'assembleur sous windows ?


 
si tu veux faire du temps réel, vo mieux avoir une culture à ce niveau.
 
si tu fais du SQL ça te sert à rien....

Reply

Marsh Posté le 20-04-2004 à 22:13:00    

Sous Windows tu as des fonctions pratiques pour mesurer les durée : GetTickCount te renvoi la durée depuis que l'OS est démarré... En ms
 
Si tu veux plus de précision sous Windows, il y a un reste que les anciens du dos connaissent (merci microsoft) : le 8253 via les fonctions QueryPerformanceFrequency et QueryPerformanceCounter... La précision du tick est de 12 / 14.318MHz soit environ 838ns.
 
Parfois on doit pouvoir se passer de RDTSC !
Voire même mesurer la fréquence du CPU...


Message édité par christophe_d13 le 20-04-2004 à 22:15:15
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed