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 :

sprintf() versus std::string


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 : 62
    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
    Par défaut sprintf() versus std::string
    Tout d'abord, je ne voudrais pas lancer un troll, ceci dit, je viens de voir dans un thread récent le code suivant:
    Code C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buffer[512];
    sprintf(buffer, "%04X", val);
    Code C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::ostringstream oss;
    oss << std::setw(4) << std::setfill('0') << std::hex << std::uppercase << val;
    std::string s = oss.str();
    Ces 2 code produisent (ou devraient produire) le même résultat

    Je sais qu'il y a des puristes du C++ qui ne parleront que de la 2eme approche et que ne voudrons même pas voir la 1ere.

    Par contre, en termes de performances, quel est le coup de tout cela ?

    Mon avis intuitif est que l'approche C me 'semble' plus performante que l'approche C++ (dans ce cas là). Est-ce que quelqu'un pourrait me convaincre du contraire afin que je fasse le pas pour supprimer/eradiquer cette manière que j'ai d'utiliser le sprintf()

    Il me semble aussi que l'approche C est plus compréhensible mais c'est un autre problème, j'ai appris le C il y a 20 ans et le C++ il y a quelques années seulement, il y a des réflexes durs à oublier.
    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
    .

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Xio,

    Je ne pense pas qu'on puisse dire a priori quelle version sera plus rapide, cela dépendra beaucoup de l'implémentation du compilateur, et des optimisations qu'il saura mettre en place.

    Quoi qu'il en soit, je ne pense pas qu'il y ait une énorme différence.

    Peu importe la performance à ce niveau là, à moins que tu veuilles appliquer ça à des millions de chaînes.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Par contre, en termes de performances, quel est le coup de tout cela ?
    C'est vraiment important?

    Carl

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    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 : 62
    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
    Par défaut
    Citation Envoyé par 5hdumatin Voir le message
    C'est vraiment important?l
    Oui cela peut avoir de l'importance si je sais que cela risque d'être effectué plusieurs milliers de fois et que les performances ne sont pas forcément au top (par rapport au sprintf() par exemple), je vais peut être envisager dès le début une autre approche.
    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
    .

  6. #6
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    En faisant un gros effort pour considérer la question avec des œillères et donc du strict point de vue de la performance:
    Dans un cas on a des formattages qui doivent être décodés d'une chaine de format à chaque écriture, dans l'autre le formattage est codé en dur à la compilation par appel de fonction, voire inline. Il est donc fort probable que la version C++ soit plus rapide pour la partie écriture, surtout si le format change peu (la version C++ donne un formattage persistant). En revanche, si le but est de récupérer le résultat dans un tableau, il faut considérer le cout de convertir le contenu des stringstream vers une chaine. Selon l'implémentation, ça peut être un simple retour vers un pointeur qui se fige à l'appel de .str(). Dans ce cas, la version C++ va gagner dans tous les scénarios. Par contre, il y a sûrement des implémentations naïves qui dupliquent le tableau de travail interne à stringstream, et alors si on fait un sprintf bête sans formattage malin directement dans le tableau destination, ça doit aller plus vite.
    Pour ce qui est du cout de la duplication finale à l'intérieur d'un objet std::string, il n'est pas comparable, car le résultat des 2 codes est différent: dans un cas on a un tableau de char brut de mémoire, dans l'autre on a un objet puissant std::string.
    J'ai du mal cependant à croire que la performance de ce bout de code ait le moindre intérêt dans une vraie application.

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Ne pas oublier que les flux C++ permettent de plugguer diverses choses dynamiquement (filtrages, encodages, redirections) dont on n'a pas toujours besoin.

    cf à ce sujet les FAStreams, de Maciej Sobczak, qui sont des classes façon flux mais plus optimisées.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par ram_0000 Voir le message
    Oui cela peut avoir de l'importance si je sais que cela risque d'être effectué plusieurs milliers de fois et que les performances ne sont pas forcément au top (par rapport au sprintf() par exemple), je vais peut être envisager dès le début une autre approche.
    Ou sinon tu peux aussi attendre de profiler et si ça se révèle le goulet d'étranglement il sera toujours temps de remplacer par des printf.

    MAT.

  9. #9
    screetch
    Invité(e)
    Par défaut
    je ne suis pas forcement d'accord. je vois beaucoup de code STL qui fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(map.find(element) == map.end())
      map.insert(std::make_pair(element, value));
    ce qui cause deux recherches dans l'arbre alors qu'une seule est necessaire. je n'aime pas voir ce genre de code car il n'est pas optimal mais m'apparaitra pas au profiling. or, le mieux est de savoir comment le faire bien du premier coup pour ensuite le faire tout le temps!!

    si on sait ce qui est le mieux alors on peut l'employer.

  10. #10
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Les printf avec des char tableaux[] je ne suis pas fana pour les employer c'est moins safe que std::string qui est éprouvé.
    Ceci si on fait un dépassement de tableau et si c'est mal employé.
    D'ailleurs me semble-t-il avec VC++2003 et + on a des security warnings sur printf et compagnie..
    Et puis char[] cela tend à être un peu obsolète parce que ça ne supporte pas unicode qui est en 16bits

  11. #11
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par screetch Voir le message
    je ne suis pas forcement d'accord. je vois beaucoup de code STL qui fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(map.find(element) == map.end())
      map.insert(std::make_pair(element, value));
    ce qui cause deux recherches dans l'arbre alors qu'une seule est necessaire. je n'aime pas voir ce genre de code car il n'est pas optimal mais m'apparaitra pas au profiling. or, le mieux est de savoir comment le faire bien du premier coup pour ensuite le faire tout le temps!!

    si on sait ce qui est le mieux alors on peut l'employer.
    Le but de ce code est d'éviter une modification de l'élément associé à la clef "element" si il est déjà dans la map (car dans ce cas, insert le remplace par le nouvel élément). Les deux recherches sont donc nécessaires et enlever le find() modifie le comportement de l'application.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Oui cela peut avoir de l'importance si je sais que cela risque d'être effectué plusieurs milliers de fois et que les performances ne sont pas forcément au top (par rapport au sprintf() par exemple), je vais peut être envisager dès le début une autre approche.
    Hé hé! Justement! C'était une question piège. Si tu ne peux pas répondre de manière certaine et chiffrée à une question du genre "la performance de ce bout de code est-elle importante?", c'est qu'elle ne l'est pas.

    Le profiler de code est ton ami: c'est lui qui a la réponse à ta question.

    Carl

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par 5hdumatin Voir le message
    Si tu ne peux pas répondre de manière certaine et chiffrée à une question du genre "la performance de ce bout de code est-elle importante?", c'est qu'elle ne l'est pas.
    Si on ne connait pas la réponse à une question, la réponse est négative?

    Il y a un problème avec ta logique.

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

Discussions similaires

  1. sprintf avec des std::string
    Par Bart_lx dans le forum C++
    Réponses: 13
    Dernier message: 07/12/2007, 09h10
  2. Réponses: 7
    Dernier message: 25/11/2005, 17h11
  3. [débutant] equivalent à sprintf pour les std::string
    Par Biosox dans le forum SL & STL
    Réponses: 22
    Dernier message: 26/08/2005, 12h46
  4. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  5. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07

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