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 du produit d’origine :   Visual C #
Numéro de la base de connaissances initiale :   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 de Microsoft .NET Framework sont invariantes (en d’autres points, 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înes C/C++.

Cet article fait référence à l’espace de noms de la bibliothèque de classes .NET Framework System.Text .

Description des chaînes dans .NET Framework

Une technique pour améliorer la concaténation strcat() des 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, elle ne peut pas être modifiée sur place. L' + opérateur de concaténation C# construit une nouvelle chaîne et réduit les performances lorsqu’il concatène de grandes quantités de texte.

Toutefois, .NET Framework inclut une StringBuilder classe qui est optimisée pour la concaténation de chaînes. Elle offre les mêmes avantages que l’utilisation d’un tableau de caractères dans 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.

Création et exécution d’une application de démonstration

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

  2. Le code suivant utilise les += opérateurs de concaténation et la StringBuilder classe pour le temps 5 000 concaténation de 30 caractères chacune. Ajoutez ce code à la procédure principale.

    const int sLen=30, Loops=5000;
    DateTime sTime, eTime;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    // Time string concatenation.
    sTime = DateTime.Now;
    for(i=0;i<Loops;i++) sDest += sSource;
    eTime = DateTime.Now;
    Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");
    // Time StringBuilder.
    sTime = DateTime.Now;
    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();
    eTime = DateTime.Now;
    Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");
    // 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 semblable aux exemples suivants :

    Concatenation took 6.208928 seconds.
    String Builder took 0 seconds.
    Press ENTER to finish...
    
  4. Appuyez sur entrée pour arrêter l’exécution de l’application et fermer la fenêtre de la console.

Résolution des problèmes

  • Si vous êtes dans un environnement qui prend en charge la diffusion en continu des données, comme dans un formulaire Web ASPX ou si votre application écrit les données sur le disque, envisagez d’éviter la surchage de la mémoire tampon ou le StringBuilder et écrivez les données directement dans le flux par le biais de la Response.Write méthode ou de 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 nettoyage de la mémoire. Dans les deux cas, l’utilisation StringBuilder de la classe facilite l’utilisation du tas par rapport à l’utilisation de l' + opérateur.

Références

La StringBuilder classe contient de nombreuses autres méthodes de 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.