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

POSIX C Discussion :

Lenteur d'origine inconnu! Version de Gcc ? Ou accés IO trop lourd ?


Sujet :

POSIX C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Lenteur d'origine inconnu! Version de Gcc ? Ou accés IO trop lourd ?
    Messieurs dames, bonjour!

    Etudiant, devant réaliser des projets tout au long de l'année. J'attribue beaucoup d'importance à la vitesse d'execution de mes programmes, dans le but d'avoir un algorithme optimisé.

    Voilà un cas qui me laisse septique et dont j'ai du mal à expliquer l'origine!
    J'ai deux programmes identiques, enfin presque. L'algorithme principal est le même.
    J'ai compilé chacun d'eux avec dans l'un l'utilisation de printf, et dans l'autre l'utilisation de write.
    En utilisant printf, le binaire est largement plus rapide. Par exemple dans un test de benchmark, il met 5sec sur une map de 5000²octet à traiter, tandis qu'avec write, le temps est décuplé, souvent plus de 20sec...

    Le probleme ? Je suspecte en fait, les accès IO des fonctions, en effet, avec printf, la fonction affiche le buffer seulement si un retour à la ligne('\n') est détecté ou si c'est la fin du programme. Tandis que write, écrite directement, sans attendre, le '\n'.
    Je ne peux utiliser printf, à cause de la norme
    Mais je n'en suis pas sûr, car de temps en temps, avec printf, le programme met autant de temps. Je suis sûr que ce n'est pas un probleme de conception d'algo, parcontre, peut être une compilation qui foire...
    Par exemple, une différence de perf, entre gcc3.4, et gcc4.

    Exemple de test de benchmark :
    ./time mon_prog > /dev/null

    Vos retours d'expérience, et toutes autres aides est la bienvenue.
    Bien à vous.
    Un tek1 ;-)

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par s4m1r Voir le message
    Le probleme ? Je suspecte en fait, les accès IO des fonctions, en effet, avec printf, la fonction affiche le buffer seulement si un retour à la ligne('\n') est détecté ou si c'est la fin du programme. Tandis que write, écrite directement, sans attendre, le '\n'.
    Tout-à-fait. Les fonctions f----() sont gérées par une bibliothèque et utilisent des buffers pour étaler les transferts. Ça provoque parfois des effets de bord assez amusants.

    Tu peux utiliser setbuf() pour les manipuler.

    Je ne peux utiliser printf, à cause de la norme
    Comment ça ? printf() est dans la norme !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Réglé!
    Je fais une erreur en suspectant gcc! Mais il rentrait pas dans mes priorités.
    La preuve, j'ai "résolu" le problème.
    Voici deux exemples, avant et après de l'affichage de mon tableau à 2dimension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    --avant : 
       Boucle1:
            Boucle2:
               write(tab[y][x]) ou printf /* mais printf interdit */
            fin_b2
         write('\n') ou pritnf("\n");
       fin_b1
    L'affichage constant d'un caractére, et l'appel répétitif sur les accés IO, est mauveis et ralentit le programme! Cette expérience me montre, qu'il faut d'abord stocker le résultat dans une chaine, puis l'afficher complétement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    --apres: 
       str_initiliasé;
       Boucle1:
            Boucle2:
               str[x] = tab[y][x] 
            fin_b2
         write(str);
         write('\n')
       fin_b1
    Note : A titre d'exemple je n'ai pas mis les arguments exactes dans les fonctions write(int fd, char *str, str_len) et printf(char *str, ...).

    Cette méthode est largement plus optimisé!
    En espérant que ces petits exemples servent à d'autres.
    Bonne journée

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Comment ça ? printf() est dans la norme !
    Mon école utilise une norme, pour imposer un style de programmation commun à tous les élèves, ce qui facilite pas mal de chose(possibilité de lire facilement le code de l'autre, avoir un code généralisé, propre, structuré, faciliter la résolution de problème, permettre aux élèves de recoder la libc, et comprendre comment fonctionne leurs fonctions, les réutiliser, faciliter la correction du code... et pleins d'autres choses). Je ne peux te l'expliquer en quelques lignes.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par s4m1r Voir le message
    Mon école utilise une norme, pour imposer un style de programmation commun à tous les élèves, ce qui facilite pas mal de chose(possibilité de lire facilement le code de l'autre, avoir un code généralisé, propre, structuré, faciliter la résolution de problème, permettre aux élèves de recoder la libc, et comprendre comment fonctionne leurs fonctions, les réutiliser, faciliter la correction du code... et pleins d'autres choses). Je ne peux te l'expliquer en quelques lignes.
    Si, ton école, c'est Épitech, ne t'inquiète pas, on a déjà beaucoup glosé sur la chose. :-) Que ce soit ici ou ailleurs ...

    Le problème de ta norme, c'est qu'elle n'est pas normalisée ! :-) et qu'elle est surtout très discutable. Qu'il y ait des règles d'usage pour formatter le code de tout le monde sur un seul modèle, à la limite, que ce soit des règles de bon usage, c'est une autre paire de manches. Je veux bien que l'on proscrive le printf() dans le cadre d'un problème donné, mais si c'est d'une manière générale, on ne se mèle de recoder la libc derrière et de but en blanc.

    Bon. Tu n'as pas le droit au printf() ? Soit. Conforme-toi à l'exercice, mais un conseil : essaie de diversifier tes sources d'info et de te faire ta propre opinion.

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Et donc pour vous inciter à écrire du code propre, il vous interdisent une fonction parfaitement standard, au profit d'une fonction qui ne l'est pas ?

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par matafan Voir le message
    Et donc pour vous inciter à écrire du code propre, il vous interdisent une fonction parfaitement standard, au profit d'une fonction qui ne l'est pas ?

    Ben cela ne me choque pas trop, le chef à raison parce que ... c'est le chef.

    Dans un projet, tu n'utilise pas toujours les meilleures techno mais parfois celles imposées par le contexte (chef de projet, client, chef comptable, ...)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu dois apprendre à bufferiser tes appels à write(), tout comme printf() le fait.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Ou autrement, tu utilises fwrite(). Mais j'imagine que tu n'y a pas droit non plus ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il n'a droit à aucune fonction de stdio. Mais dans le cas idéal, il est censé être capable de faire la même chose (enfin, sauf peut-être pour le printf, qui est 'achement compliqué quand même).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par s4m1r Voir le message
    Etudiant, devant réaliser des projets tout au long de l'année. J'attribue beaucoup d'importance à la vitesse d'execution de mes programmes, dans le but d'avoir un algorithme optimisé.

    Voilà un cas qui me laisse septique
    Alors va vite te désinfecter !
    et dont j'ai du mal à expliquer l'origine!
    J'ai deux programmes identiques, enfin presque. L'algorithme principal est le même.
    J'ai compilé chacun d'eux avec dans l'un l'utilisation de printf,
    ce qui est le choix logique.
    et dans l'autre l'utilisation de write.
    Ce qui est absurde.
    En utilisant printf, le binaire est largement plus rapide. Par exemple dans un test de benchmark, il met 5sec sur une map de 5000²octet à traiter, tandis qu'avec write, le temps est décuplé, souvent plus de 20sec...
    C'est tout à fait possible, vu que printf() est bufferisé... Les appels aux fonctions d'écritures sont probablement optimisés et donc il y en a peu (en réalité, ça dépend de l'implémentation...). Alors que si on appelle write() (surtout pour 1 octet), on multiplie les appels systèmes, ce qui est évidemment une solution très chère en temps machine. Il n'y a aucune raison valable d'utiliser write() pour faire un affichage.
    Le probleme ? Je suspecte en fait, les accès IO des fonctions, en effet, avec printf, la fonction affiche le buffer seulement si un retour à la ligne('\n') est détecté ou si c'est la fin du programme. Tandis que write, écrite directement, sans attendre, le '\n'.
    C'est tout à fait probable...
    Je ne peux utiliser printf, à cause de la norme
    pardon, c'est nerveux...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut La norme.
    Oui en effet, l'école est epitech. Je ne voulais pas la citer, pour justement éviter que le topic tourne vers de la pub indirecte ou change de fond.

    Par "cette fonction n'est pas à la norme" je ne voulais pas sous entendre, qu'en dehors de l'école, ce n'était pas une fonction conseillé.
    D'ailleurs, cette fonction n'est pas parfaite, elle bug sur certains cas précis d'affichage(petite parenthèse :p)

    Cela dit, j'ai une opinion tout à fait personnelle, ça fait des années que je programme. Mais ce n'est pas moi qui va changer l'école. Et puis je ne suis pas là pour contester les choses, mais plutôt de réaliser ce qu'on me demande en temps et en heure. N'es-ce pas un challenge supplémentaire d'être amputer de certaines fonctions/mots-clefs ? Par exemple, on ne peut pas utiliser non plus de for, switch(continue,...),...
    Je m'en fou, à partir du moment que j'ai connaissance de ces fonctions, rien ne m'empêche de les utiliser pour des projets extra-scolaire.

    Tout est discutable. Je reste neutre, je ne suis pas là pour défendre l'école, chacun a sa propre façon de concevoir sa méthodologie éducatif et je l'accepte. Vite il est bientôt 23h42, et je dois réussir à compiler mon projet sous sparc :d!

    Citation Envoyé par Médinoc
    Tu dois apprendre à bufferiser tes appels à write(), tout comme printf() le fait.
    C'est exactement ce que fait ma correction, et les résultats sont bons :-)

    En espérant vous retrouver dans d'autres sujets, je vous souhaite une excellente soirée

  13. #13
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par s4m1r Voir le message
    D'ailleurs, cette fonction n'est pas parfaite, elle bug sur certains cas précis d'affichage(petite parenthèse :p)
    Tu parles de printf ? Tu en as trop dit ou pas assez... J'aimerais bien savoir de quels bugs tu parles.

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par s4m1r Voir le message
    Oui en effet, l'école est epitech. Je ne voulais pas la citer, pour justement éviter que le topic tourne vers de la pub indirecte ou change de fond.
    Ou que ça vire au troll, n'aie pas peur de le dire ! :-)

    Par "cette fonction n'est pas à la norme" je ne voulais pas sous entendre, qu'en dehors de l'école, ce n'était pas une fonction conseillé.
    D'ailleurs, cette fonction n'est pas parfaite, elle bug sur certains cas précis d'affichage(petite parenthèse :p)
    Sauf qu'on s'entend dire également que l'école espère qu'au moins 50% de ces précepts seront appliqués par les étudiants au cours de leur vie professionnelle.

    Cela dit, j'ai une opinion tout à fait personnelle, ça fait des années que je programme. Mais ce n'est pas moi qui va changer l'école. Et puis je ne suis pas là pour contester les choses, mais plutôt de réaliser ce qu'on me demande en temps et en heure. N'es-ce pas un challenge supplémentaire d'être amputer de certaines fonctions/mots-clefs ? Par exemple, on ne peut pas utiliser non plus de for, switch(continue,...),...
    Si. Si tant est toutefois que ce n'est pas imposé en permanence.
    Ne le prends pas mal, ça n'a rien de personnel.

    Je m'en fou, à partir du moment que j'ai connaissance de ces fonctions, rien ne m'empêche de les utiliser pour des projets extra-scolaire.
    Malheureusement, ce n'est pas le cas de tout le monde

    C'est exactement ce que fait ma correction, et les résultats sont bons :-)
    En l'occurence oui, mais il y a encore trop de gens qui estiment qu'un problème est résolu quand les symptômes ne se présentent plus. À l'image de :

    16:39 on m'a demander de debugger un prog C qui marche pas, pour faire
    simple j'ai remplacé tous les malloc( x) par des mallox( x * 100 )
    ... et bien maintenant ça marche ... aller Zou ! au suivant !
    %

    ... qui a bien fait rire tout le monde mais qui reste trop répandue.

    En espérant vous retrouver dans d'autres sujets, je vous souhaite une excellente soirée
    À toi de même et à bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel version de GCC utiliser : 3.x.x ou 4.x.x ?
    Par Pierre.g dans le forum Choisir un environnement de développement
    Réponses: 3
    Dernier message: 25/08/2006, 17h10
  2. Version de Gcc pour Linux RH2.1
    Par Troll dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 14/08/2006, 16h58
  3. Utilisation de deux versions de gcc sur la même plateforme
    Par Anouschka dans le forum Administration système
    Réponses: 5
    Dernier message: 04/05/2006, 11h32
  4. [Socket][Client/Server]Exception d'origine inconnue
    Par willowII dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/11/2005, 22h36

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