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

Cet article fournit des informations sur l’amélioration des performances de concaténation de chaînes dans Visual C#.

Version d’origine du produit : Visual C#
Numéro de la base de connaissances d’origine : 306822

Résumé

Cet article présente les avantages de l’utilisation de la StringBuilder classe par rapport aux techniques de concaténation traditionnelles. Les chaînes dans 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 qui est habitué aux techniques de manipulation de chaînes C/C++.

Cet article fait référence à l’espace de noms System.Textde la 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 les données de chaîne dans la mémoire tampon. Dans le .NET Framework, une chaîne est immuable et ne peut pas être modifiée sur place. L’opérateur de concaténation C# + génère une nouvelle chaîne et réduit les performances lorsqu’il concatène de grandes quantités de texte.

Toutefois, le .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++, l’augmentation automatique de la taille de la mémoire tampon (si nécessaire) et 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 timer 5 000 concaténations de 30 caractères chacune. Ajoutez ce code à la procédure main.

    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.

Résolution des problèmes

  • Si vous êtes dans un environnement qui prend en charge la diffusion en continu des données, par exemple dans un formulaire web ASPX ou si votre application écrit les données sur le disque, évitez la surcharge de mémoire tampon de la concaténation ou StringBuilderle , et écrivez 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 le 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 permet d’utiliser le tas plus efficacement que l’opérateur + .

References

La StringBuilder classe contient de nombreuses autres méthodes de manipulation de chaîne sur place qui ne sont pas décrites dans cet article. Pour plus d’informations, recherchez StringBuilder dans l’aide en ligne.