salut les amis, svp je veux calculer le temps ecouler par cett boucle en microseconde :
for(i=0 ; i<10000; i++);
un simple code en C sera aprecie (car je travail sous console Turbo C++ 3.0)
merci d'avance.
-----
salut les amis, svp je veux calculer le temps ecouler par cett boucle en microseconde :
for(i=0 ; i<10000; i++);
un simple code en C sera aprecie (car je travail sous console Turbo C++ 3.0)
merci d'avance.
je pense qu'en faisant le code suivant, tu aura ce que tu cherche:
En revanche, je pense que le résultat est en seconde (à vérifier).Code:#include<time.h> .... .... main(){ time_t depart, fin, duree; ... ... depart=time(NULL); for(i=0 ; i<10000; i++); fin=time(NULL); duree=difftime(fin,depart); .... .... }
Je me suis inspiré de cette page pour t'aider
merci bcp Mr umfred pour votre aide, oui en revanche la duree renvoyee est en secondes, moi je suis besoin d'une fonction qui retourne la duree en microseconde.
mais en tt cas merci baucoup .
Jutilise un truc comme ça en c++ vc6
LARGE_INTEGER Frequency;
LARGE_INTEGER Before, After;
QueryPerformanceFrequency(&Fre quency);
QueryPerformanceCounter(&Befor e); // Mesure du temps avant
for(i=0 ; i<10000; i++);
QueryPerformanceCounter(&After ); // Mesure du temps après
Time = 1000.0 * (After.QuadPart - Before.QuadPart)
Fait attention que certain compilateur (intel par exemple) ne convertissent pas du code "qui ne fait rien" en instruction machine
merci Mr argusazure pour votre reponse, mais une question, ce code semble marcher parfetement , mais supposant qu'une fonction C (et non C++)existe comme la votre , et que je travail en mode console (dos 6.22) est ce que la duree renvoyee sera la meme ?
et autre chose ...
si je fia marcher mon code sous une machine PIII 1GHz et ce que la duree calculer par le code sera la meme sur une autre machine par example P IV 2.4Ghz ou meme un PIII 500 MHz ...?
merci d'avance
Bonsoir
Utiliser une boucle soft pour mesurer un temps est dans 99% des cas voué à l'échec(caches, fréquence coeur, bus etc etc)!
De même une horloge calculée en flottant a partir d'une reference parfaite merdera inevitablement(guess why?)
Il faut utiliser les fonctions faisant appel aux timers hardware présent dans tous les µ mais même avec ça il faut que la fonction tienne compte de la fréquence réelle de la réference temporelle (1/4 frequence bus sur PPC par ex si ma memoire est bonne).
JR
merci Mr.jiherve pour votre reponse.
oui , je suis bien daccor avec vous, mais il arrive que je lis une Trame HDLC via la broche Busy de mon port paralelle, bon c'est de la communication Asynchrone dont je ne connais pas le debis pour que je je definis la longueur de chaque bits dans la Frame recue, donc puisque les communications Asychrones qui utilise le protocole de communication HDLC travail avec des debis moyen ou inportants (les 800Kb/s ou meme 4Mb/s) donc j'ai besoin dans mon code d'un delais a l'ordre des microseconde ou nanosecondes, bon...le C ne fournis que les fonction Sleep() et delay() , la premiere fournis u ndelais en secondes et la dexieme en millisecondes, donc g creer ma propre fonction qui me fournis un delais a l'ordes des microsecondes . finalment j'ai reusis a lire la frame avec ce dealais :
for(i=0;i<41000;i++);
mais moi ce que je veux, combien est le temps ecoule par cette boucle pour que je programme mon PIC16F84A avec, biensur cette boucle sous le processuer Intel ne prendra pas la meme duree d'execution sous le processeur de mon micro controleur PIC16F84A, mais le compilateur de ce dernier me fournis les focntions delay_ms() et delay_us(), donc ce que je veux est de calculer la duree d'execution de :
for(i=0;i<41000;i++);
et de la remplacer par :
delay_us(??????)
j'espere que j'ai ete claire pour vous.
merci d'avance pour les suggestions.
(J'ai oublié de diviser par Frequency à la fin)Envoyé par bimomerci Mr argusazure pour votre reponse, mais une question, ce code semble marcher parfetement , mais supposant qu'une fonction C (et non C++)existe comme la votre , et que je travail en mode console (dos 6.22) est ce que la duree renvoyee sera la meme ?
et autre chose ...
si je fia marcher mon code sous une machine PIII 1GHz et ce que la duree calculer par le code sera la meme sur une autre machine par example P IV 2.4Ghz ou meme un PIII 500 MHz ...?
merci d'avance
Ca renvoi un temps écoulé donc plus la machine est rapide, plus le temps écoulé est court pour une même quantité de calculs.
Par contre ça ne marche que sous windows...
bimo si c'est pour une boucle pour un PIC, j'ai un petit logiciel qui te créé le code en assembleur selon le délai que tu veux.
voir le post#10 de ce post
merci Mr argusazure pour votre reponse, oui c'est bien ce que j'attendais
et merci Mr umfred pour le ptit logiciel , ou je pense que ca sera indisponsable pour moi quand je voudrais creer des delays a lordre des nanosecodes. merci bcp.
Mais, personne n'a ma toujours pas repondus,
selon mon dernier post, je vous ai dis que je veux calculer le temps ecoule par la boucle (for(i=0;i<41000;i++)); sous mon ordinateur, pour la remplacer dans mon programme pour le PIC par le delais convenable.
y'a t il pas un code C simple qui s'execute sous console Dos ? qui fais ce travail, car je dois fair bcp de menage dans mon ordinateur pour installer le VC++.
et autre chose ... si j'installe le VC++ et j'utilise le code que Mr argusazure m'a donner, est ce que la duree calculee sera la meme sous windows que sous Dos ? car je pense que windows boufe les resources systeme donc diminue les capacites de la machine pas comme le Dos qui travail en mode minimum de configuration.
merci pour votre patience.
Ben rajoute un include <windows.h> et regarde si ces fonctions sont compliées. Si ton processeur executer un autre processus entre ton QueryPerformanceCounter(&Befor e) et ton QueryPerformanceCounter(&After ), je ne pense pas que les tops d'horloges seront comptabilisés par ces fonctions et donc ca n'aura pas d'impact sur ton temps de traitement. Mais je n'en mettrais pas ma main à couper.
Bonsoir
Au risque de me repeter une boucle soft aura un temps d'execution variable en fonction du processeur, des options de compil, de la frequence du processeur , etc ... etc et de l'age du capitaine.
Donc la question n'a pas de réponse!
JR
Bonjour
A mon avis le seul moyen de connaitre le temps utilisé par une boucle est de compiler un programme ne comportant que la boucle, de desassembler le code, de reperer la boucle (en general on trouve une instruction INCrement ou DECrement suivie par un test et un branchement, avec boucles imbriquées si la variable de boucle est grande) et en s'aidant du jeu d'instruction du microproc utilisé de calculer,en cycle d'horloge, le temps total. Mais bien sûr ce calcul ne donnera une référence temporelle fiable que sur l'ordi utilisé pour faire ce test.
Pour compléter les réponses, tu écris et compile ce programme avec ton logiciel de prgrammation pour PIC. La compilation devrait te créer un fichier assembleur (sinon rajouter l'option dans la ligne de commande du compilateur) il suffit ensuite de simuler cette boucle avec le debugger qui doit posséder une fenêtre qui affiche le nombre de cycle en "temps réel" lors de l'éxécution (ce qui te servira à calculer le temps réel de la boucle (sur les PICs, temps de cycle = 4 * période de l'oscillateur))
Bonjour,
pour revenir sur les timers de l'api windows QueryPerformanceCounter, pouvez vous me confirmer qu'il y a un problème si on les utilises avec un pc multi processeurs, dans le cas où le premier et le second QueryPerformanceCounter (avant et apres la section de code à chronométrer) ne sont pas executés par le même processeur. Et y a t il une solution autre que forcer la tache à s'exécuter arbitrairement sur un processeur. Corolaire : alors comment chronométrer une tache multi thread ?