12
votes

Double à la chaîne sans notation scientifique ni zéro traînant, efficacement

Cette routine est appelée une zillion fois pour créer de grands fichiers CSV pleins de chiffres. Y a-t-il un moyen plus efficace de pour cela? XXX


3 commentaires

Le titre semble faux, devrait être double pour ficeler?


Oups - Le titre est en arrière. . . Bien sûr, il est double à ficeler


Dupliqué possible de Formatage n chiffres significatifs en C ++ sans notation scientifique


3 Réponses :


1
votes
  • Utilisez snprintf et un tableau de Char au lieu de stringstream et chaîne
  • Passez un pointeur sur Char tampon sur DBL2STR dans lequel il imprime (afin d'éviter le constructeur de copie de chaîne appelé lorsque vous retournez). Assemblez la chaîne à imprimer dans un tampon de caractère (ou convertissez le tampon de charme lorsque vous avez appelé à une chaîne ou l'ajoutez à une chaîne existante)
  • déclarer la fonction inline dans un fichier d'en-tête XXX


1 commentaires

Mot-clé InLine n'affecte pas directement l'optimisation par "Inlinge", c'est une instruction pour la liaison que ce symbole peut apparaître plusieurs fois dans la liaison et ce n'est pas une erreur. La fonction est déjà statique en question.



10
votes

Avant de commencer, vérifiez si le temps significatif est dépensé dans cette fonction. Faites cela en mesurant, soit avec un profileur ou autre. Sachant que vous appelez cela un zillion Times est très bien, mais s'il s'avère que votre programme ne dépense toujours que 1% de son temps dans cette fonction, rien que vous ne le faites ici peut éventuellement améliorer la performance de votre programme de plus de 1%. Si c'était le cas, la réponse à votre question serait "à l'intention de vos besoins, cette fonction ne peut pas être considérablement plus efficace et que vous gaspillez votre temps si vous essayez".

première chose, évitez s.substr (0, S.Size () - 1) code>. Cela copie la plupart des string et em> cela rend votre fonction inéligible pour NRVO, alors je pense que vous obtiendrez généralement une copie à votre retour. Donc, le premier changement que je ferais est de remplacer la dernière ligne avec: p> xxx pré>

mais si la performance est une préoccupation sérieuse, voici comment je le ferais. Je ne suis pas prometteur que c'est le plus rapide possible, mais cela évite quelques problèmes avec des allocations inutiles et une copie. Toute approche impliquant stringstream code> va nécessiter une copie à partir du résultat. Nous voulons donc une opération de plus bas niveau, snaprintf code>. P>

void append_dbl2str(std::string &s, double d) {
    size_t len = std::snprintf(0, 0, "%.10f", d);
    size_t oldsize = s.size();
    s.resize(oldsize + len + 1);
    // technically non-portable
    std::snprintf(&s[oldsize], len+1, "%.10f", d);
    // remove nul terminator
    s.pop_back();
    // remove trailing zeros
    s.erase(s.find_last_not_of('0') + 1, std::string::npos);
    // remove trailing point
    if(s.back() == '.') {
        s.pop_back();
    }
}


0 commentaires

5
votes

efficace en termes de vitesse ou de brièveté?

char buf[64];
sprintf(buf, "%-.*G", 16, 1.0);
cout << buf << endl;


1 commentaires

Le - n'est pas strictement nécessaire (il est laissé justifie)