J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
Tu veux dire que tu as effectivement vérifié que std::string est trop lent pour tes besoins ? Si oui, et si tu as une estimation de la taille finale, tu peux commencer par essayer en utilisant std::string::reserve().
On Sat, 29 Apr 2006 23:22:57 +0200, Delf <no-one@nowhere.no>:
J'ai une chaîne que je créé par concaténation de nombreux caractères...
pas très performant...
Tu veux dire que tu as effectivement vérifié que std::string est trop
lent pour tes besoins ?
Si oui, et si tu as une estimation de la taille finale, tu peux
commencer par essayer en utilisant std::string::reserve().
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
Tu veux dire que tu as effectivement vérifié que std::string est trop lent pour tes besoins ? Si oui, et si tu as une estimation de la taille finale, tu peux commencer par essayer en utilisant std::string::reserve().
Jean-Marc Bourguet
Delf writes:
je cherche un équivalent de StringBuffer/StringBuilder mais en C++.
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
ostringstream ?
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Delf <no-one@nowhere.no> writes:
je cherche un équivalent de StringBuffer/StringBuilder mais en C++.
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas
très performant...
ostringstream ?
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
je cherche un équivalent de StringBuffer/StringBuilder mais en C++.
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
ostringstream ?
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Fabien LE LEZ
On 30 Apr 2006 09:53:45 +0200, Jean-Marc Bourguet :
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
ostringstream ?
Pour rajouter des caractères, j'ai des doutes. Utiliser directement std::string::append() n'est-il pas plus efficace ?
On 30 Apr 2006 09:53:45 +0200, Jean-Marc Bourguet <jm@bourguet.org>:
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas
très performant...
ostringstream ?
Pour rajouter des caractères, j'ai des doutes. Utiliser directement
std::string::append() n'est-il pas plus efficace ?
Tu veux dire que tu as effectivement vérifié que std::string est trop lent pour tes besoins ?
Non. Mais si je réalloue à chaque concaténation, je suis persuadé que c'est pas le mieux à faire.
Si oui, et si tu as une estimation de la taille finale, tu peux commencer par essayer en utilisant std::string::reserve().
J'avais pensé à utiliser reverse() mais je ne peux pas estimer la taille finale.
-- Delf Do not use this email in Cc! L'alcool tue lentement. On s'en fout. On n'est pas pressé.
Fabien LE LEZ
On Sun, 30 Apr 2006 11:53:58 +0200, Delf :
Tu veux dire que tu as effectivement vérifié que std::string est trop lent pour tes besoins ?
Non.
Dans ce cas, fais-le. Optimiser au hasard ne donne jamais rien de bon.
Mais si je réalloue à chaque concaténation,
Et pourquoi réallouerais-tu à chaque concaténation ? Note que si tu utilises reserve() à bon escient, tu es assuré de l'absence de réallocation.
Tu as besoin d'un type "chaîne de caractères". Le type par défaut en C++ est std::string. C'est donc le premier à essayer. À la rigueur, si tu n'es pas sûr de toi, tu peux faire un typedef std::string Chaine; pour pouvoir facilement changer le type a posteriori.
Crée puis compile le programme, et fais-le tourner. S'il tourne assez vite, ton boulot est terminé. S'il est trop lent, il te faut un profiler pour déterminer la cause de cette lenteur. Elle n'est pas forcément où tu l'attends.
On Sun, 30 Apr 2006 11:53:58 +0200, Delf <no-one@nowhere.no>:
Tu veux dire que tu as effectivement vérifié que std::string est trop
lent pour tes besoins ?
Non.
Dans ce cas, fais-le.
Optimiser au hasard ne donne jamais rien de bon.
Mais si je réalloue à chaque concaténation,
Et pourquoi réallouerais-tu à chaque concaténation ?
Note que si tu utilises reserve() à bon escient, tu es assuré de
l'absence de réallocation.
Tu as besoin d'un type "chaîne de caractères". Le type par défaut en
C++ est std::string. C'est donc le premier à essayer.
À la rigueur, si tu n'es pas sûr de toi, tu peux faire un
typedef std::string Chaine;
pour pouvoir facilement changer le type a posteriori.
Crée puis compile le programme, et fais-le tourner.
S'il tourne assez vite, ton boulot est terminé.
S'il est trop lent, il te faut un profiler pour déterminer la cause de
cette lenteur. Elle n'est pas forcément où tu l'attends.
Tu veux dire que tu as effectivement vérifié que std::string est trop lent pour tes besoins ?
Non.
Dans ce cas, fais-le. Optimiser au hasard ne donne jamais rien de bon.
Mais si je réalloue à chaque concaténation,
Et pourquoi réallouerais-tu à chaque concaténation ? Note que si tu utilises reserve() à bon escient, tu es assuré de l'absence de réallocation.
Tu as besoin d'un type "chaîne de caractères". Le type par défaut en C++ est std::string. C'est donc le premier à essayer. À la rigueur, si tu n'es pas sûr de toi, tu peux faire un typedef std::string Chaine; pour pouvoir facilement changer le type a posteriori.
Crée puis compile le programme, et fais-le tourner. S'il tourne assez vite, ton boulot est terminé. S'il est trop lent, il te faut un profiler pour déterminer la cause de cette lenteur. Elle n'est pas forcément où tu l'attends.
Fabien LE LEZ
On Sun, 30 Apr 2006 11:52:07 +0200, Delf :
A vrai dire, je ne sais pas. En Java ou C#, quand je concatène des caractères, je n'utilise jamais la classe String mais
son équivalent.
C'est quoi, "son équivalent" ?
Après, je n'ai jamais fait de tests de performance, je fais confiance aux documentations.
Quelles documentations ? Ça m'étonnerait que l'éditeur d'un compilateur C++ récent claironne fièrement que son implémentation de std::string est pourrie...
On Sun, 30 Apr 2006 11:52:07 +0200, Delf <no-one@nowhere.no>:
A vrai dire, je ne sais pas. En Java ou C#, quand je concatène des
caractères, je n'utilise jamais la classe String mais
son équivalent.
C'est quoi, "son équivalent" ?
Après, je n'ai jamais fait de tests de performance, je fais confiance
aux documentations.
Quelles documentations ?
Ça m'étonnerait que l'éditeur d'un compilateur C++ récent claironne
fièrement que son implémentation de std::string est pourrie...
A vrai dire, je ne sais pas. En Java ou C#, quand je concatène des caractères, je n'utilise jamais la classe String mais
son équivalent.
C'est quoi, "son équivalent" ?
Après, je n'ai jamais fait de tests de performance, je fais confiance aux documentations.
Quelles documentations ? Ça m'étonnerait que l'éditeur d'un compilateur C++ récent claironne fièrement que son implémentation de std::string est pourrie...
James Kanze
Delf wrote:
je cherche un équivalent de StringBuffer/StringBuilder mais en C++.
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
L'idée de base, en C++, c'est que std::string soit assez performant pour ça. Si ce n'est pas le cas, essaie std::vector<char>, avec une conversion au moyen de std::string( v.begin(), v.end() ). Et si tu connais la taille finale d'avance, n'hésite pas à te servir de std::vector<>::reserve().
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Delf wrote:
je cherche un équivalent de StringBuffer/StringBuilder mais en
C++.
J'ai une chaîne que je créé par concaténation de nombreux
caractères... pas très performant...
L'idée de base, en C++, c'est que std::string soit assez
performant pour ça. Si ce n'est pas le cas, essaie
std::vector<char>, avec une conversion au moyen de
std::string( v.begin(), v.end() ). Et si tu connais la taille
finale d'avance, n'hésite pas à te servir de
std::vector<>::reserve().
--
James Kanze kanze.james@neuf.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
je cherche un équivalent de StringBuffer/StringBuilder mais en C++.
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
L'idée de base, en C++, c'est que std::string soit assez performant pour ça. Si ce n'est pas le cas, essaie std::vector<char>, avec une conversion au moyen de std::string( v.begin(), v.end() ). Et si tu connais la taille finale d'avance, n'hésite pas à te servir de std::vector<>::reserve().
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
James Kanze
Jean-Marc Bourguet wrote:
Delf writes:
je cherche un équivalent de StringBuffer/StringBuilder mais en C++.
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
ostringstream ?
Il a bien dit « pas très performant ». D'après ce que j'ai entendu dire, ça pourrait s'appliquer encore plus à ostringstream.
Dans la pratique :
std::vector< char > : garantit les performances des push_back ; il garantit en plus que reserve ait un effet.
std::string : rien de garantit, et dans la pratique, il y a, ou il y a bien eu, des implémentations où push_back prend un temps O(n), où n est la taille de la chaîne (ce qui veut dire que construire une chaîne de taille n de cette manière est O(n^2)).
Dans une implémentation qui n'est pas trop mauvaise, reserve doit avoir un effet (mais la norme permet de le traiter comme un no-op). En faisant quelque chose du genre : if ( buffer.size() == buffer.capacity() ) { buffer.reserve( 2 * buffer.size() ) ; } avant chaque push_back, on doit dans la pratique atteindre quelque chose qui s'approche aux performances de std::vector< char >.
std::ostringstream : la norme ne dit absolument rien de ses performances, qui sont souvent assez décévantes.
Personellement, si ce n'est que du caractère par caractère, j'utiliserais std::string et push_back d'abord. Si ça s'avérait trop lent, je le remplacerais avec std::vector< char > et push_back, suivi d'un std::string( v.begin(), v.end() ) pour convertir le résultat en chaîne.
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Jean-Marc Bourguet wrote:
Delf <no-one@nowhere.no> writes:
je cherche un équivalent de StringBuffer/StringBuilder mais
en C++.
J'ai une chaîne que je créé par concaténation de nombreux
caractères... pas très performant...
ostringstream ?
Il a bien dit « pas très performant ». D'après ce que j'ai
entendu dire, ça pourrait s'appliquer encore plus à
ostringstream.
Dans la pratique :
std::vector< char > : garantit les performances des push_back ; il
garantit en plus que reserve ait un effet.
std::string : rien de garantit, et dans la pratique, il y a, ou
il y a bien eu, des implémentations où push_back prend un
temps O(n), où n est la taille de la chaîne (ce qui veut
dire que construire une chaîne de taille n de cette manière
est O(n^2)).
Dans une implémentation qui n'est pas trop mauvaise, reserve
doit avoir un effet (mais la norme permet de le traiter
comme un no-op). En faisant quelque chose du genre :
if ( buffer.size() == buffer.capacity() ) {
buffer.reserve( 2 * buffer.size() ) ;
}
avant chaque push_back, on doit dans la pratique atteindre
quelque chose qui s'approche aux performances de
std::vector< char >.
std::ostringstream : la norme ne dit absolument rien de ses
performances, qui sont souvent assez décévantes.
Personellement, si ce n'est que du caractère par caractère,
j'utiliserais std::string et push_back d'abord. Si ça s'avérait
trop lent, je le remplacerais avec std::vector< char > et
push_back, suivi d'un std::string( v.begin(), v.end() ) pour
convertir le résultat en chaîne.
--
James Kanze kanze.james@neuf.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
je cherche un équivalent de StringBuffer/StringBuilder mais en C++.
J'ai une chaîne que je créé par concaténation de nombreux caractères... pas très performant...
ostringstream ?
Il a bien dit « pas très performant ». D'après ce que j'ai entendu dire, ça pourrait s'appliquer encore plus à ostringstream.
Dans la pratique :
std::vector< char > : garantit les performances des push_back ; il garantit en plus que reserve ait un effet.
std::string : rien de garantit, et dans la pratique, il y a, ou il y a bien eu, des implémentations où push_back prend un temps O(n), où n est la taille de la chaîne (ce qui veut dire que construire une chaîne de taille n de cette manière est O(n^2)).
Dans une implémentation qui n'est pas trop mauvaise, reserve doit avoir un effet (mais la norme permet de le traiter comme un no-op). En faisant quelque chose du genre : if ( buffer.size() == buffer.capacity() ) { buffer.reserve( 2 * buffer.size() ) ; } avant chaque push_back, on doit dans la pratique atteindre quelque chose qui s'approche aux performances de std::vector< char >.
std::ostringstream : la norme ne dit absolument rien de ses performances, qui sont souvent assez décévantes.
Personellement, si ce n'est que du caractère par caractère, j'utiliserais std::string et push_back d'abord. Si ça s'avérait trop lent, je le remplacerais avec std::vector< char > et push_back, suivi d'un std::string( v.begin(), v.end() ) pour convertir le résultat en chaîne.
-- James Kanze Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34