Partager via


Utiliser Visual C# pour améliorer les performances de concaténation de chaîne

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.Textbibliothè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

  1. Démarrez Visual Studio, puis créez une application console Visual C#.

  2. Le code suivant utilise les += opérateurs de concaténation et la StringBuilder 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();
    
  3. 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...
    
  4. 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 la Response.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 la StringBuilder 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.