Page 1 sur 1

question sur le temps d'exeution

MessagePosté: 20 Novembre 2014, 19:21
par anyone
s'il vous plait j'ai besoin d'un outil (sur windows) une commande,ou un soft
qui calcule le temps d'execution d'un .exe ,et principe de calcule du temps au niveau assembleur et merci d'avance :)

Re: question sur le temps d'exeution

MessagePosté: 21 Novembre 2014, 04:31
par anyone
OK!
on peut utiliser l'instruction asm :RDTSC (read time stamp counter) qui met dans EDX:EAX le nbre des tick d'horloge
ecoulés . on va l'utiliser de la façon suivante:
RDTSC
CDQ ;le resultat etant en quadeWord (EDX:EAX)
MOV QWORD PTR [base+0],EAX
;bloc d'instruction dont on veut calcule
;le tmps d'execution
RDTSC
SUB EAX,QWORD PTR [base+0]
jusqu'à maintenant on a trouvé le nombre de cycles d'horloge il faut donc le diviser par la frequence d'horloge de votre processeur
pour savoir le temps d'exe du bloc :gné: sur ce je vous demande votre avis! est-ce que j'ai raison ou pas!

Re: question sur le temps d'exeution

MessagePosté: 21 Novembre 2014, 07:13
par etherlord
Cela peut fonctionner, mais ne fournira pas forcément un résultat correct avec les architectures actuelles (multi-core). Il est recommandé d'utiliser l'API QueryPerformanceCounter.

etherlord

Re: question sur le temps d'exeution

MessagePosté: 21 Novembre 2014, 18:09
par anyone
merci etherlod :D ;
l'API QueryPerformanceCounter ça a l'air bien pour se simplifier la vie

Re: question sur le temps d'exeution

MessagePosté: 23 Novembre 2014, 23:36
par anyone
mais j'ai un petit probleme avec cette API :oops:
le resultat est stocké dans un LARGE_INTEGER mais moi je code en C ,et j'ai pas trouvé le
format (%<qqch>) pour afficher ce resultat avec printf. j'ai testé %ll mais ça n'a pas marché :cry:

Re: question sur le temps d'exeution

MessagePosté: 24 Novembre 2014, 07:45
par etherlord
Pour prendre en charge les très grands nombres, il faut utiliser une librairie (Bignum, GMP, etc.)

etherlord

Re: question sur le temps d'exeution

MessagePosté: 24 Novembre 2014, 13:35
par dionosis
Salut,

hXXp://msdn.microsoft.com/en-us/library/windows/desktop/aa383713%28v=vs.85%29.aspx

Pas besoin de lib de BigNum ici :)
S'il compile le long long alors il peut au pire effectuer des calculs dessus.
Mais peut-être même pas besoin...

@anyone>
Quel compilateur emploies tu ?

Utilise le QuadPart de la structure et sers toi de "%I64d" si VS (2008 min), "%lld" si autre (pas trop ancien).
Si ton implémentation de printf ne le supporte quand même pas, mets à jour ton compilateur ou si tu ne peux pas (ça m'étonnerait, c'est une problématique d'embarqué habituellement) écrit simplement un équivalent en utilisant des divisions successives vu que comme précisé plus haut tu es en mesure d'effectuer des calculs dessus.

++

Re: question sur le temps d'exeution

MessagePosté: 24 Novembre 2014, 14:24
par Horgh
anyone a écrit:mais j'ai un petit probleme avec cette API :oops:
le resultat est stocké dans un LARGE_INTEGER mais moi je code en C ,et j'ai pas trouvé le
format (%<qqch>) pour afficher ce resultat avec printf. j'ai testé %ll mais ça n'a pas marché :cry:


https://stackoverflow.com/questions/284 ... g-long-int

Re: question sur le temps d'exeution

MessagePosté: 24 Novembre 2014, 14:34
par anyone
dionosis a écrit:@anyone>
Quel compilateur emploies tu ?

j'utilise le GNU GCC Compiler,
voici le code que j'ai ecrit :
Code: Tout sélectionner
#include<stdio.h>
#include<windows.h>
#include<Winbase.h>
int main(){
   int x=0,y=12;
 LARGE_INTEGER *p,*q;
 LARGE_INTEGER r;
 QueryPerformanceCounter(p);
 x=y*x-y*y;  //pour tester
 QueryPerformanceCounter(q);
 if(QueryPerformanceCounter(p)&&QueryPerformanceCounter(q))
   r=(*q)-(*p);  // erreur de compilation: il n'arrive pas à soustraire 2 LARGE_INTEGER
                  //"invalid operands to binary - "
 printf("%lld",r);
 return 0;
 }

Re: question sur le temps d'exeution

MessagePosté: 24 Novembre 2014, 15:12
par dionosis
@anyone>
Apparemment tu n'as lu ni la doc que je t'ai linkée, ni ma réponse, ni tes cours sur les pointeurs, ni tes cours sur les optimisations du compilateur (pour ce dernier c'est pardonnable).

Code: Tout sélectionner
#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    LARGE_INTEGER p, q;

    QueryPerformanceCounter(&p);
    Sleep(123);
    QueryPerformanceCounter(&q);
    printf("%llu",(unsigned long long)(q.QuadPart) - (unsigned long long)(p.QuadPart));

    return 0;
 }


++

Re: question sur le temps d'exeution

MessagePosté: 24 Novembre 2014, 18:00
par anyone
mes respects ! :shock: