Comment afficher la durée d'éxécution d'un programme en asm? [ASM] - ASM - Programmation
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?)
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...
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
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
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. (je vérifies dans le doute )
---- autant pour moi y'a pas de problème de ring 0 (donc c'est moi qui sors )
Marsh Posté le 19-03-2004 à 13:21:14
prendre le temps consacré à ton processus me semble la meilleure solution (GetProcessTimes)
Marsh Posté le 19-03-2004 à 13:32:30
mais je voudrais calculer cette durée en asm dans le prog lui même.
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
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 :
|
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
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
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 |
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 ?
Marsh Posté le 19-03-2004 à 23:21:16
Harkonnen a écrit : rdtsc roulaize |
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
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
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. (je vérifies dans le doute ) |
c'est bien ce qu'il me semblait, je l'utilise sans souci sous XP
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. |
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.
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
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)
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... |
finalement, mon idée de départ était pas si con
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
Marsh Posté le 20-03-2004 à 15:53:18
Beaucoup de gens font encore de l'assembleur sous windows ?
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
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....
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...
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