IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Temps d'exécution algorithme


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 37
    Points : 46
    Points
    46
    Par défaut Temps d'exécution algorithme
    Bonjour,

    Je doit effectuer un projet qui permet de comparer le temps d'exécution de différent algorithme de tri.

    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    double t1, t2, t3;
    long clk_tck = CLOCKS_PER_SEC;
    t1 = clock();
    tri_par-selection();
    t2 = clock();
    t3 = t2-t1;
    printf ("Temps consommes : %lf",t3/(double)clk_tck);
     
    .
    .
    .
     
    // ici la méme chose avec d'autre fonction de tri
    La fontion marche quelque fois(sa affiche 0.0015 ou autre), mais elle affiche souvent 0.000 sec.

    Y a t'il un moyen pour avoir plus de précision ? esque ma facon de faire est correcte ?

    Merci bonne soirée.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Bonjour,

    Citation Envoyé par chneu87 Voir le message
    Y a t'il un moyen pour avoir plus de précision ?
    Malheureusement non! Est ce que ton projet doit forcément être basé sur la pratique? Parce que le problème dans ce raisonnement c'est le fait que ton système est multitâche. C'est à dire qu'il interrompt ton programme pour laisser la place à d'autres et en favorise même certains qui ont la priorité de passage! D'où les différences que tu as constaté dans les résultats (tu peux avoir un algo 20 fois plus rapide qu'un autre mais si le kworkerd passe par là c'est fichu)

    Et tu n'as concrêtement aucun moyen de prévoir le scheduler (et d'autres facteurs d'ordres "matériels" mais moins pénalisants). Et la commande clock() te donne le résultat en millisecondes en partant d'une date bien précise (1700 sur Linux je crois). Bref, en assembleur comme dans n'importe quel autre langage, on a pas encore trouvé de solution matérielle ou logicielle "convenable". C'est un problème bien connu dans les benchmarks. Les résultats sont soumis à l'environnement.

    Donc tu as deux solutions (trois en fait mais la dernière est trop compliqué pour rien!).

    _ Soit tu te bases sur des statistiques, tu fais tourner chaque algo en boucle genre 1 000 000 de fois par machine et tu fais des moyennes.

    _ Soit tu passes par la logique et l'algorithmique. Ca reste quand même la solution la plus fiable et la plus complète. Tu peux savoir par exemple à partir de quelles valeurs tel algo devrait être plus rapide qu'un autre etc...

    _ Sinon tu peux aussi recompiler un noyau linux ne faisant tourner qu'un programme à la fois. C'est simple à faire, certe (une option à changer dans le .config), mais ça reste ch*ant pour un seul exercice et surtout si ce n'est pas pour tester d'autres choses en plus comme les bugs et le comportement du programme.

    Cordialement

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    En commande shell,

    time ./mon_programme

    Il affichera le temps utilisateur, le temps total et le temps sur le CPU il me semble.

  4. #4
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Vous pouvez utiliser clock_gettime.

    Selon votre os, architecture etc, c'est une fonction qui vous donne une précision pouvant aller jusqu'à la nanoseconde (demander à clock_getres).


    Le clock id vous permet de choisir une horloge locale au process (CLOCK_PROCESS_CPUTIME_ID).

    Pour le reste voir les pages de man.

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par valefor Voir le message
    Vous pouvez utiliser clock_gettime.

    Selon votre os, architecture etc, c'est une fonction qui vous donne une précision pouvant aller jusqu'à la nanoseconde (demander à clock_getres).


    Le clock id vous permet de choisir une horloge locale au process (CLOCK_PROCESS_CPUTIME_ID).

    Pour le reste voir les pages de man.
    Utilisable uniquement sur les système POSIX.

    La Glib fournit des outils de mesures portables qui permettent une résolution de la microseconde. Toutefois, cela reste avant tout un problème d'algorithmique.

    Thierry

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par chneu87 Voir le message
    BY a t'il un moyen pour avoir plus de précision ? esque ma facon de faire est correcte ?
    oui..

    J'ai posté il y a quleques années dans la rubrique Sources une fonction éqivalente à clock() donnant le temps en micro-secondes

    Recuperer le temps reel absolu

    Maintenant, cette mseure sera empirique.

    Comme l'a signalé Baccali, la vraie comparaison est algorithmique, par rapport à la complexité algorithmique...

  7. #7
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par baccali Voir le message
    _ Sinon tu peux aussi recompiler un noyau linux ne faisant tourner qu'un programme à la fois. C'est simple à faire, certe (une option à changer dans le .config)
    Quelle est cette option ?

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    si tu peux accéder à une machine msdos avec un compilateur C alors tu as une solution simpliste. j'en ai encore 1 ou 2 ... mais les résultats ne correspondent pas aux architectures actuelles. tous les instruments de mesure sont faux, même sous unix, les temps cpu affichés tiennent compte d'une partie de la mise en place du cadre utilisateur pour son quota de temps. mais ils donnent une bonne idée quand même ! la seule vraie solution, c'est de disposer d'une vraie machine monotache ou bien de la simuler; c'est ce qu'a fait knuth (The Art of Computer Programming) mais c'est assez lourd à mettre en place. si le sujet t’intéresse vraiment passe moi un mp (si çà intéresse beaucoup de monde on peut publier un petit truc).

    mais la vielle machine msdos, c'est très très bien ...

    A+

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Citation Envoyé par valefor Voir le message
    Quelle est cette option ?
    Salut,

    Cordialement

  10. #10
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par chneu87 Voir le message
    La fontion marche quelque fois(sa affiche 0.0015 ou autre), mais elle affiche souvent 0.000 sec.
    C'est un problème de granularité. A ta place, je contournerai le problème. Si les temps ne sont pas affichables parce que trop petits, fais boucler. Ça marche très bien pour comparer des performances de fonctions. En exemple la comparaison de deux fonctions de swap un peu différentes. C'est toujours empirique, mais c'est quand même lissé suffisamment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <stdio.h>
    #include <time.h>
    #include <assert.h>
     
    void swap1(int *a, int *b)
    {
        static int c;
        c = *a;
        *a = *b;
        *b = c;
    }
     
    void swap2( int * const a, int * const b)
    {
        int c = *a;
        *a = *b;
        *b = c;
    }
     
    size_t looper(void (*pfunc)(int*, int*))
    {
        int a = 12345678;
        int b = 23456789;
        size_t now = time(0);
        int count = 0;
        while(count++ < 2000000000)
            pfunc(&a, &b);
        return time(0) - now;
    }
     
    void utest(void)
    {
        int a = 1234;
        int b = 5678;
        swap1(&a, &b);
        assert(a == 5678);
        assert(b == 1234);
        swap2(&a, &b);
        assert(a == 1234);
        assert(b == 5678);
    }
     
    int main(void)
    {
        utest();
        printf("2000000000 calls of swap1 : %u seconds\n", looper(swap1));
        printf("2000000000 calls of swap2 : %u seconds\n", looper(swap2));
        return 0;
    }
    Citation Envoyé par anacharsis Voir le message
    la seule vraie solution, c'est de disposer d'une vraie machine monotache
    Même sur une machine monotâche il y a des interruptions, donc du temps non maitrisé.

    A+

    Pfeuh

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @pfeuh
    pour les interruptions tu as 100 fois raison. seule la méthode de knuth n'en tient pas compte. mais elles existent dans tous les systèmes, quelque soit le schéma les résultats sont biaisés.

    ta réponse intelligente n'a fait plaisir. merci !

    A+

  12. #12
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par baccali Voir le message
    Ha oui, du coup il ne suffit pas que de recompiler le noyau, il reste encore du code à écrire après ça

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    'fin bref, ça dérive pas mal :

    • clock() et la fonction de la Glib mentionnée par Thierry Chapuis fournissent le temps utilisateur

    • ma fonction GetClock() donne le temps réel absolu (système).

    • la vraie solution de comparasion entre des algorithmes est le calcul de la complexité algorithmique, comme l'a mentionné Baccali (ce qui est aisément trouvable pour les divers tris : Sorting algorithm)



    Recompiler un kernel ou avoir une machine monotâche sans OS (car l'OS tourne en même temps que l'appli), c'est pire que prendre un bulldozer pour écraser une mouche...

  14. #14
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    c'est vrai qu'on a pas mal dérivé :
    Je doit effectuer un projet qui permet de comparer le temps d'exécution de différent algorithme de tri.
    je ne pense pas que son directeur de projet souhaite un cours sur la complexité des algorithmes. il garde ça pour lui ... et il sera très content avec des clock().
    un tableau d'entiers assez grand pour que les temps ne soient pas ridicules (64000 c'est assez).

    A+

  15. #15
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Et le tableau d'entier c'est pour quoi ?

  16. #16
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @valefor
    le trier...

    A+

  17. #17
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 37
    Points : 46
    Points
    46
    Par défaut
    Merci de vos réponses, qui m'aide beaucoup. Je suis encore à la recherche de solutions.

    Le sujet me semble trés vaste et du coup je recherche les divers possibilitées.

    Si vous avez d'autres solutions ou des "précisions" sur des remarques déjà publées n'hésitez pas, ça ne pourra que m'aider.

  18. #18
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par anacharsis Voir le message
    le trier...

    A+
    Rha ben oui . Je pensais que c'était pour enregistrer les temps relevés (donc dans ton exemple, il aurait fait 64000 runs).

  19. #19
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    Bonjour,

    je ne suis pas sûr d'avoir saisi ton problème. Tu cherches à connaître le temps d'exécution du programme, ou écrire un programme A qui compte le temps d'exécution du programme B ?

    Dans le premier cas, tu peux utiliser un framework de WCET (Worst Case Execution Time).
    Dans le second, bon courage

  20. #20
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @ManusDei
    salut !
    comment trouver le WCET d'un tri rapide dont on ne dispose pas du code ?

    A+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. algorithme de tri et temps d'exécution
    Par khadi8 dans le forum Débuter
    Réponses: 5
    Dernier message: 04/01/2013, 18h41
  2. Réponses: 2
    Dernier message: 24/04/2011, 08h43
  3. Temps d'exécution d'un algorithme génétique
    Par debalgo dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 24/03/2011, 00h53
  4. Réponses: 1
    Dernier message: 24/02/2009, 21h31
  5. [TP] Mesure du temps d'exécution d'un algorithme
    Par williamdunord dans le forum Turbo Pascal
    Réponses: 19
    Dernier message: 18/05/2007, 06h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo