begin process at 2008 07 19 16:38:50
1 212 905 membres
227 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMMENT CALCULER LE TEMP D'EXÉCUTION DE CERTAINES FONCTIONS OU BOUT DE CODE DANS CES PROGRAMME


Information sur la source

Catégorie :Astuces Classé sous : exécution, temps, optimisation, optimiser, clock Niveau : Débutant Date de création : 10/04/2004 Date de mise à jour : 18/05/2007 01:46:55 Vu : 8 014

Note :
7,5 / 10 - par 2 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

Un simple exemple du: comment calculer le temp d'exécution pour optimisation ou autre ... Code en C

Source

  • /*
  • Fichier chrono.h
  • */
  • #ifndef CHRONO_H
  • #define CHRONO_H
  • #include <stdio.h>
  • #include <time.h>
  • #if defined(__cplusplus) && __cplusplus
  • extern "C" {
  • #endif
  • /* Pour s'assurer que clock_t soit bien définie */
  • #ifndef _CLOCK_T_DEFINED
  • typedef long clock_t;
  • #define _CLOCK_T_DEFINED
  • #endif
  • static clock_t STARTCLOCK;
  • static clock_t ENDCLOCK;
  • #define StartClock() STARTCLOCK=clock();
  • #define StopClock() ENDCLOCK=clock();
  • static void ShowClock(char * prefix, short show_unformated) {
  • printf("\n*****************************************************\n");
  • if ( prefix != NULL ) {
  • printf("-- %s --\n", prefix);
  • }
  • printf("Elapsed time: %4.2f\n", (double) ( ( ENDCLOCK - STARTCLOCK ) / CLOCKS_PER_SEC ));
  • if ( show_unformated == 1 ) {
  • printf("Unformated: %d\n", (ENDCLOCK - STARTCLOCK));
  • }
  • printf("*****************************************************\n");
  • }
  • #if defined(__cplusplus) && __cplusplus
  • }
  • #endif
  • #endif /* Fin du fichier chrono.h */
  • /*
  • Comment l'utiliser !? C'est simlpe, très simple
  • */
  • #include <string.h>
  • #include "chrono.h"
  • int main(int argc, char* argv[]) {
  • char machaine[50];
  • int i = 0;
  • StartClock(); /* Début */
  • for ( ; i < 5000; i++ ) {
  • strcpy(machaine, "une chaine a copier ici");
  • }
  • StopClock(); /* Fin */
  • ShowClock("strcpy() test", 1); /* affiche le résultat */
  • /* C'est tout! Simplement 3 petites lignes */
  • return 0;
  • }
/*
    Fichier chrono.h
*/
#ifndef CHRONO_H
#define CHRONO_H

#include <stdio.h>
#include <time.h>

#if defined(__cplusplus) && __cplusplus
 extern "C" {
#endif

/* Pour s'assurer que clock_t soit bien définie */
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

static clock_t STARTCLOCK;
static clock_t ENDCLOCK;

#define StartClock() STARTCLOCK=clock();
#define StopClock() ENDCLOCK=clock();

static void ShowClock(char * prefix, short show_unformated) {
	printf("\n*****************************************************\n");
	if ( prefix != NULL ) {
		printf("-- %s --\n", prefix);
	}
	printf("Elapsed time: %4.2f\n", (double) ( ( ENDCLOCK - STARTCLOCK ) / CLOCKS_PER_SEC ));
	if ( show_unformated == 1 ) {
		printf("Unformated: %d\n", (ENDCLOCK - STARTCLOCK));
	}
	printf("*****************************************************\n");
}

#if defined(__cplusplus) && __cplusplus
 }
#endif

#endif /* Fin du fichier chrono.h */







/*

    Comment l'utiliser !? C'est simlpe, très simple

*/



#include <string.h>
#include "chrono.h"

int main(int argc, char* argv[]) {

char machaine[50];
int i = 0;

    StartClock(); /* Début */

    for ( ; i < 5000; i++ ) {

        strcpy(machaine, "une chaine a copier ici");

    }

    StopClock(); /* Fin */
    ShowClock("strcpy() test", 1);  /* affiche le résultat */

    /* C'est tout! Simplement 3 petites lignes */
    return 0;

}




Conclusion

Devrait fonctionner sous la plupart des compilateurs C/C++ ou les fonctions clock() et printf() existe ...  stdio.h(printf) et time.h(clock) sont requis.
18 mai 2007 01:46:55 :
ajout des mots clés( Vous aussi, mettez vos sources à jour !!! Ajoutez les mots clés !!! )
  • signaler à un administrateur
    Commentaire de ZogStriP le 10/04/2004 20:33:15 administrateur CS

    utiliser la fonction time (sous linux) marche aussi bien !

  • signaler à un administrateur
    Commentaire de AlexMAN le 11/04/2004 09:46:36

    Salut NitRic,

    je voulais simplement demander si l'utlisation de l'api GetTickCount ne serait pas plus simple :

    int iAvant, iApres;
    int iResult;

    iAvant = GetTickCount();  //Je sais pas sil ya des arguments, a verifier
    {  ...............CODE...............}
    iApres = GetTickCount();

    iResult = iApres - iAvant;

    printf("Voila : %d\n", iResult);


    Ca me semble bocou plus simple, bien que je n'ai rien a reprocher a ta methode....

    Voila NitRic...Bonne prog !

    A++

    Alhexman



  • signaler à un administrateur
    Commentaire de djl le 11/04/2004 10:08:03

    +1

    c'est comme ca que j'ai toujours fait (mais avec clock()  )

  • signaler à un administrateur
    Commentaire de NitRic le 11/04/2004 18:18:24

    Vous êtes difficile hein ...

    time() renvoie l'heure, si ton process perd dison .03 sec de temp CPU à cause d'un autre programme ou autre, le temp d'exécution de ton programme va être .03 sec plus haut en utilisant time(), même chose pour GetTickCount() qui renvoie le uptime de Windows. clock() renvoie le temp CPU utilisé par le process appellant sans compter le temp CPU utilisé par d'autre process, si les autres process en cours font perdre .03 sec à ton process, ce .03 sec ne sera pas calculé avec clock(), ce qui est, à mon avis, plus précis que GetTickCount() & time() ...

    En plus, mon code, d'après mes connaissances, est portable, Windows, Linux/Unix, Mac, etc ... un simple copier/coller et hop! le tour est joué!


    ~(..: NitRic ::.)~

  • signaler à un administrateur
    Commentaire de NitRic le 11/04/2004 18:24:25

    j'allais oublier, alexman, GetTickCount() renvoie un DWORD et non un int

    typedef unsigned long DWORD;

    un entier non signé 32bits ... un int est(par défaut) signé

    ca peut servir à éviter par exemple: signed/unsigned mismatch
    qui n'est qu'un warning mais bon ...

  • signaler à un administrateur
    Commentaire de Pacifica le 14/04/2004 21:02:44

    Moi que je veux connaitre le temps d'execution d'une de mes instructions je fais ceci:
    #include &lt;time.h&gt;
    void main()
    {
    clock_t D,F;
    D=clock();
    instruction...
    F=clock();
    printf("Temps=%f\n\r",(F-D)/CLK_TCK);
    }
    J'utilse ceci car pour moi je trouve que c'est rapide.
    Voilà pour ma part,
    Pacifica.

  • signaler à un administrateur
    Commentaire de NitRic le 16/04/2004 03:16:27

    exactement comme mon code, sauf que moi j'ai fait ceci pour 'formater' si on veut le résultat ...


    StartClock();
    // instructions ...
    StopClock();
    ShowSlock("prefix ici, sinon NULL", 0 ou 1);


    tout simplement, StartClock() et StopClock() sont des #define donc

    StartClock();  // sera remplacé par STARTCLOCK = clock();
    et
    StopClock(); // sera remplacé par   ENDCLOCK = clock();

    et le ShowClock() est une petite fonction qui permet d'afficher le résultat tout simplement ...


    ~(.:: NitRic ::.)~

  • signaler à un administrateur
    Commentaire de anneclo le 13/01/2007 22:13:09

    Quelqu'un peut-il m'expliquer pourquoi l'exécution de ce bout de programme ne me rend que des zéros ? (avec windows et devc 4.9.9)

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS