N'importe qui peut battre la performance de mon entier à std::string code, en lien ci-dessous?
Il y a déjà plusieurs questions qui expliquent comment faire pour convertir un entier en std::string
en C++, comme les ce l'un, mais aucune des solutions prévues sont efficaces.
Voici la compilation code prêt à l'emploi pour certaines méthodes courantes de compétition:
- Le "C++ voie", à l'aide de stringstream: http://ideone.com/jh3Sa
- sprintf, qui SOI-ers recommandent habituellement à la performance consciente: http://ideone.com/82kwR
Contrairement à la croyance populaire, boost::lexical_cast
a sa propre mise en œuvre (livre blanc) et ne pas utiliser les stringstream numériques et de l'insertion des opérateurs. J'aimerais vraiment voir ses performances par rapport, parce que cette autre question suggère qu'il est misérable.
Et ma propre contribution, qui est concurrentiel sur les ordinateurs de bureau, et démontre une approche qui fonctionne à pleine vitesse sur des systèmes embarqués ainsi, à la différence des algorithmes dépend entier modulo:
- Ben algorithmes: http://ideone.com/SsEUW
Si vous souhaitez utiliser ce code, je vais le rendre disponible sous une licence BSD simplifiée (utilisation commerciale autorisée, l'attribution obligatoire). Il suffit de demander.
Enfin, la fonction ltoa
non standard mais largement disponibles.
- ltoa version, pour n'importe qui qui a un compilateur qui le fournit (ideone ne marche pas): http://ideone.com/T5Wim
Je vais poster mes mesures de performance comme une réponse sous peu.
Règles pour les algorithmes
- Fournir le code lors de la conversion d'au moins 32 bits signés et non signés entiers en décimal.
- Produire en sortie un
std::string
. - Pas de trucs qui sont incompatibles avec le filetage et les signaux (par exemple, statique tampons).
- Vous pouvez supposer un jeu de caractères ASCII.
- Assurez-vous de tester votre code sur
INT_MIN
sur un complément à deux de la machine où la valeur absolue n'est pas représentable. - Idéalement, la sortie doit être au caractère identique avec les canonique de C++ version à l'aide d'
stringstream
, http://ideone.com/jh3Samais tout ce qui est tout à fait compréhensible que le nombre correct est ok aussi - NOUVEAU: Même si vous pouvez utiliser n'importe quel compilateur et un optimiseur options (à l'exception complètement désactivé) que vous souhaitez pour le titre de comparaison, le code doit également de compiler et de donner les bons résultats sous VC++ 2010 et g++.
Espéré pour la Discussion
Outre de meilleurs algorithmes, je tiens également à obtenir certains tests sur plusieurs plates-formes différentes et les compilateurs (utilisons MO/s de débit que notre unité de mesure standard). Je crois que le code de mon algorithme (je sais que l' sprintf
indice de référence prend quelques raccourcis -- maintenant corrigé) est bien comportement défini par la norme, au moins en vertu de l'ASCII hypothèse, mais si vous voyez un comportement indéfini ou des facteurs de production pour lequel la sortie est invalide, merci de le signaler.
Conclusions:
Différents algorithmes effectuer pour g++ et VC2010, probablement en raison de les différentes implémentations de l' std::string
sur chaque. VC2010 clairement fait un meilleur travail avec NRVO, se débarrasser de retour par valeur, aidé seulement sur gcc.
Le Code a été constaté que dépasse sprintf
par un ordre de grandeur. ostringstream
tombe derrière par un facteur de 50 et plus.
Le gagnant du challenge est user434507 qui produit un code qui s'exécute à 350% de la vitesse de mon propre sur gcc. Les autres entrées sont fermées en raison des caprices de la communauté.
Le courant (finale?) la vitesse des champions sont:
- Pour gcc: user434507, à 8 fois plus rapide que l'
sprintf
: http://ideone.com/0uhhX - Pour Visual C++: Timo, à 15 fois plus rapide 'sprintf': http://ideone.com/VpKO3