Delphi StringBuilder
Existe en Delphi quelque chose comme le Java ou le C# StringBuilder? Ou Delphi n'a pas besoin de StringBuilder et s := s + 'some string';
est bon d'expression (surtout pour, tandis que les boucles).
source d'informationauteur user81864 | 2009-03-26
Vous devez vous connecter pour publier un commentaire.
Oui, Delphi propose TStringBuilder (depuis la version 2009):
Et oui, vous avez raison.
s := s + 'text';
n'est pas vraiment plus lent que d'utiliser TStringBuilder.Dans les anciennes Delphis, vous pouvez utiliser Hallvard Vassbotn's HVStringBuilder. Je n'ai pas réussi à trouver les sources sur son blog, mais vous pouvez chercher dans la OmniThreadLibrary arbre source, par exemple (vous aurez besoin des fichiers HVStringBuilder.pas et HVStringData.pas).
Delphi n'est pas "BESOIN" une chaîne constructeur de la classe, mais l'un est prévu pour Delphi 2009 si vous le désirez l'utiliser. Votre exemple de s := s + 'une chaîne de caractères'; est une méthode classique de concatinating cordes et a été utilisé en Pascal/Delphi depuis quelques dizaines d'années sans problème majeur.
La TStringBuilder mentionné est le chemin à parcourir. Dans votre cas spécifique de concaténation peut être bien, mais j'ai toujours essayer de l'alternative de toute façon.
Je suis entrain de créer un fichier EPUB corps contenu xhtml fichier en mémoire (Delphi XE) et il a été si long à produire il que je n'ai jamais le laisser terminer (environ 5 minutes plus, avant de les abandonner). C'est un exemple réel combinant autour de 800 000 caractères de texte. En prenant exactement le même code et directement en remplacement de la s:=s+" style déclarations avec TStringBuilder.Ajouter états, il réduit à environ 3 secondes. Pour rappel, il n'y avait aucune logique des changements au-delà d'un commutateur à l'écart de la concaténation.
J'ai listé quelques bonnes ressources sur Delphi chaînes ci-dessous.
Que quelqu'un d'autre a dit, simple concaténation à l'aide de l'opérateur " + " avec l'objectif général de la chaîne de types est à peu près aussi rapide que TStringbuilder (au moins pour les opérations de la forme: s := s + [. . . ]'). Ne sais pas si c'est vrai ou pas, mais les performances sont au moins assez proche de ce que [1], ci-dessous, affirme que "les Chaînes de concaténation dans Delphi est tellement rapide que la nouvelle optimisé classe StringBuilder dans Delphi 2009 ne peut pas le battre." C'est parce que les chaînes de caractères sont modifiés et Delphi transparenty alloue plus de mémoire pour la chaîne de base si nécessaire, plutôt que de faire un copier-sur-opération d'écriture de toutes les données à un nouvel emplacement dans la mémoire.
[1] http://blog.marcocantu.com/blog/delphi_super_duper_strings.html
[2] http://conferences.codegear.com/he/article/32120
[3] http://www.codexterity.com/delphistrings.htm
[4] http://www.monien.net/blog/index.php/2008/10/delphi-2009-tstringbuilder/
Je suis vraiment surpris que personne n'ait mentionné dans les commentaires ou exemples que vous pouvez demander à TStringBuilder de préallouer un tampon approprié à la tâche lors de l'instanciation. En d'autres termes, si vous pouvez venir avec une simple estimation de la quantité de mémoire que vous aurez probablement besoin, de la garniture qu'un peu, et utiliser cette valeur pour instancier TStringBuilder , vous évitez la mémoire des réaffectations à ralentir la simple concaténation de chaîne à une analyse:
- Je utiliser TStringBuilder régulièrement dans le nouveau code et à optimiser l'ancien code, et le CPU économies lors de la construction des grandes chaînes de manière incrémentielle est dramatique. Maintenant, pour être transparent, si j'ai juste une poignée de chaînes à concaténer, je ne vous embêtez pas avec TStringBuilder. Mais si je suis, disons, la sérialisation de ce qui pourrait potentiellement être une grande quantité de données, TStringBuilder est la solution évidente.
s := s + 'une chaîne de caractères" pourrait être terriblement lent si vous le faites dans une boucle, en raison de l'allocation de mémoire impliqués. J'ai dôme certains tests qui montrent que preallocating mémoire pourrait être 132 fois (OUI VOUS avez bien LU) plus vite!!!!
Le code est plus complexe que la simple s:=s + quelque chose:
mais c'est de FAÇON beaucoup plus rapide.
Voir ma réponse ici pour les détails: Quand et Pourquoi Devrais-je Utiliser TStringBuilder?
Note: mon code est optimisé pour
où c est un char, mais vous pouvez facilement l'adapter
.