Accueil
Articles
Astuces
Vidéos
Actualités
Auteurs
A propos
Contact
S'enregistrer
|
S'identifier
S'identifier
Authentification invalide
N
om d'utilisateur
M
ot de Passe
S
e souvenir de moi la prochaine fois.
S'identifier
Annuler
S'enregistrer
Mot de passe oublié ?
Les concaténations de chaines en C#
Nous allons voir au travers de cet article les différents types de concaténations de chaines en C#, comment elles sont optimisées par le compilateur afin de vous aider à choisir la meilleure solution en fonction de votre contexte.
Par
Patrice Lamarche
publié le 02/03/2010 à 14:24, lu 4122 fois, 6 pages
1 commentaire(s)
Tags:
ADO.NET
,
C#
2 | Opérateur + et String.Concat()
1 | Introduction
2 | Opérateur + et String.Concat()
3 | System.Text.StringBuilder
4 | StringBuilder VS String.Concat : Le match
5 | String.Format
6 | Conclusion
Opérateur + et String.Concat()
Il peut être étonnant de voir ces deux techniques au sein du même chapitre de cet article consacré aux concaténations de chaines mais nous allons voir qu’il en n’est rien, et que ces deux techniques de concaténations ont les mêmes performances.
Il existe en effet une légende urbaine autour du langage C# qui veut que l’utilisation de l’opérateur + nécessite d’instancier un grand nombre de string lors d’une opération de concaténation. Nous allons voir au travers de plusieurs exemples que cela n’est pas forcément le cas.
Concaténation de chaines littérales
Même si elles sont plutôt rares et n’auront pas un impact important sur la logique de vos algos, il est nécessaire de savoir que le compilateur effectue quelques optimisations simples en ce qui concerne la concaténation de chaines littérales.
Exemple :
La définition d’une chaine littérale telle que celle-ci n’aura aucun impact en terme de performance au niveau exécution puisque le compilateur C# effectue lui-même la concaténation. Si l’on regarde le résultat de la compilation on constate que le compilateur n’a pas initialisé plusieurs chaines de caractères mais uniquement une seule :
Méthode String.Concat()
Le type string propose une méthode statique permettant d’effectuer des concaténations. Cette méthode propose 11 surcharges différentes :
Attardons nous maintenant sur le fonctionnement de cette méthode.
1ère étape : La méthode Concat regarde si les chaines passées en arguments sont vides. Si c’est le cas, aucun calcul n’est nécessaire, string.Empty est directement renvoyé.
2ème étape : Une chaine de caractères est initialisée à une taille fixe égale à la somme des tailles des différentes chaines passées en paramètre. Cette chaine de caractère sera utilisée pour copier l’ensemble des caractères de chaque chaine sans avoir à multiplier les instances du type string. La méthode FastAllocateString qui est une méthode native qui va demander au garbage collector d’allouer de la mémoire pour stocker notre chaine qui stockera le résultat de la concaténation.
3ème étape : La méthode FillStringChecked est appelée pour chaque string passée en paramètre de la méthode Concat. Cette méthode n’est pas une méthode native mais est néanmoins marquée unsafe. Marquée de telle manière, FillStringChecked permet de ne pas être pénalisé par certains mécanisme de la CLR et surtout de manipuler les chaines directement sous forme de pointeur afin d’avoir une très bonne performance.
4ème étape : Le résultat de la concaténation est renvoyé
Conversion de l’opérateur + en String.Concat()
Il est important de noter que le compilateur convertis l’utilisation de l’opérateur + en appel à la méthode String.Concat.
Si on écrit le code C# suivant :
Le compilateur génère un appel à la méthode Concat afin d’effectuer l’opération de concaténation.
Nous avons vu précédemment que la méthode Concat pouvait être utilisée pour concaténer 4 chaines de caractères, si l’on souhaite effectuer une concaténation de plus de 4 string, la méthode Concat sera toujours appelée, mais le compilateur utilisera la surcharge qui accepte un tableau de string[]. Il en résultera une très légère perte de performance puisque le tableau devra être parcouru à l’aide d’une boucle for.
Il est à noter que chaque expression de concaténation est remplacée par un appel de la méthode à la méthode Concat. C’est-à-dire que si on décompose la concaténation, le compilateur va créer un appel à la méthode Concat pour chaque expression :
Il faut donc prêter attention à la manière de définir ses expressions de concaténation afin d’éviter de payer le coût de différents appels à cette méthode et d’allocation des différentes chaines puisque que dans ce cas-là, nous multiplions les allocations inutilement.
Si vous devez absolument avoir un grand nombre d’expressions de concaténations, il va falloir se tourner vers une autre solution afin d’éviter le problème évoqué ci-dessus : la classe StringBuilder.
1
2
3
4
5
6
»
Démarrer une discussion
Quand le nombre de chaines, préférez concat
Chargement ...
Discussion démarée par
bleroy
le 03/03/2010 à 09:00, 1 commentaire(s).
Ecrire un commentaire
Titre
Commentaire
Annuler