Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit des informations sur l’amélioration des performances de concaténation de chaîne dans Visual C#.
Version du produit d’origine : Visual C#
Numéro de base de connaissances d’origine : 306822
Résumé
Cet article présente les avantages de l’utilisation de la classe sur les StringBuilder
techniques de concaténation traditionnelles. Les chaînes de Microsoft .NET Framework sont invariantes (autrement dit, le texte référencé est en lecture seule après l’allocation initiale). Il offre de nombreux avantages en matière de performances et pose quelques défis au développeur habitué aux techniques de manipulation de chaîne C/C++.
Cet article fait référence à l’espace de noms System.Text
bibliothèque de classes .NET Framework.
Description des chaînes dans le .NET Framework
Une technique pour améliorer la concaténation strcat()
de chaînes dans Visual C/C++ consiste à allouer un grand tableau de caractères en tant que mémoire tampon et copier des données de chaîne dans la mémoire tampon. Dans .NET Framework, une chaîne est immuable, elle ne peut pas être modifiée en place. L’opérateur de concaténation C# +
génère une nouvelle chaîne et provoque une réduction des performances lorsqu’il concatène de grandes quantités de texte.
Toutefois, .NET Framework inclut une StringBuilder
classe optimisée pour la concaténation de chaînes. Il offre les mêmes avantages que l’utilisation d’un tableau de caractères en C/C++, et augmente automatiquement la taille de la mémoire tampon (si nécessaire) et effectue le suivi de la longueur pour vous. L’exemple d’application de cet article illustre l’utilisation de la StringBuilder
classe et compare les performances à la concaténation.
Générer et exécuter une application de démonstration
Démarrez Visual Studio, puis créez une application console Visual C#.
Le code suivant utilise les
+=
opérateurs de concaténation et laStringBuilder
classe pour time 5 000 concaténations de 30 caractères chacune. Ajoutez ce code à la procédure principale.const int sLen = 30, Loops = 5000; int i; string sSource = new String('X', sLen); string sDest = ""; // Time string concatenation. var stopwatch = System.Diagnostics.Stopwatch.StartNew(); for (i = 0; i < Loops; i++) sDest += sSource; stopwatch.Stop(); Console.WriteLine($"Concatenation took {stopwatch.ElapsedMilliseconds} ms."); // Time StringBuilder. stopwatch.Restart(); System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1)); for (i = 0; i < Loops; i++) sb.Append(sSource); sDest = sb.ToString(); stopwatch.Stop(); Console.WriteLine($"String Builder took {stopwatch.ElapsedMilliseconds} ms."); // Make the console window stay open // so that you can see the results when running from the IDE. Console.WriteLine(); Console.Write("Press Enter to finish ... "); Console.Read();
Enregistrez l'application. Appuyez sur F5 pour compiler, puis exécutez l’application. Les fenêtres de console doivent afficher une sortie similaire aux exemples :
Concatenation took 348 ms. String Builder took 0 ms. Press ENTER to finish...
Appuyez sur Entrée pour arrêter l’exécution de l’application et fermer la fenêtre de console.
Dépannage
Si vous êtes dans un environnement qui prend en charge la diffusion en continu des données, comme dans un formulaire web ASPX ou votre application écrit les données sur disque, envisagez d’éviter la surcharge de mémoire tampon de concaténation ou le
StringBuilder
, et d’écrire les données directement dans le flux via laResponse.Write
méthode ou la méthode appropriée pour le flux en question.Essayez de réutiliser l’existant
StringBuilder class
plutôt que de réallouer chaque fois que vous en avez besoin. Ce qui limite la croissance du tas et réduit le garbage collection. Dans les deux cas, l’utilisation de laStringBuilder
classe rend plus efficace l’utilisation du tas que l’opérateur+
.
References
La StringBuilder
classe contient de nombreuses autres méthodes pour la manipulation de chaînes sur place qui ne sont pas décrites dans cet article. Pour plus d’informations, recherchez StringBuilder
dans l’aide en ligne.