COMMENT FAIRE : Améliorer les performances de concaténation de chaîne dans Visual C# .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 306822 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F306822
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article présente les avantages de l'utilisation de la classe StringBuilder par rapport aux techniques de concaténation classiques. Les chaînes de .NET Framework sont immuables (en d'autres termes, le texte référencé est en lecture seule après l'allocation initiale). Cela présente de nombreux avantages de performances et pose certains défis au développeur qui est habitué aux techniques de manipulation de chaîne C/C++.

Description des chaînes de .NET Framework

Une des techniques pour améliorer la concaténation de chaîne par rapport à strcat() dans Visual C/C++ consiste à allouer un important tableau de chaînes de caractères comme tampon et de copier les données de chaîne dans le tampon. Dans .NET Framework, une chaîne est immuable ; elle ne peut pas être changée de place. L'opérateur de concaténation C# + met en place une nouvelle chaîne et entraîne une réduction des performances lorsqu'il effectue la concaténation d'importantes quantités de texte.

Cependant, .NET Framework comporte une classe StringBuilder optimisée pour la concaténation de chaîne. Il présente les mêmes avantages que l'utilisation d'un tableau de chaînes de caractères dans C/C++ et augmente automatiquement la taille du tampon (si cela s'avère nécessaire) et effectue le suivi de la longueur pour vous. L'exemple d'application de cet article présente l'utilisation de la classe StringBuilder et compare les performances par rapport à la concaténation.

Construire et exécuter une application de démonstration

  1. Démarrez Visual Studio .NET et créez une nouvelle application de console Visual C#.
  2. Le code suivant utilise l'opérateur de concaténation += et la classe StringBuilder pour calculer 5 000 concaténations de 30 caractères chacune. Ajoutez le code suivant à la procédure principale.
    const int sLen=30, Loops=5000;
    DateTime sTime, eTime;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    // 
    // Calcule la concaténation de chaîne.
    // 
    sTime = DateTime.Now;
    for(i=0;i<Loops;i++) sDest += sSource;
    eTime = DateTime.Now;
    Console.WriteLine("La concaténation a pris " + (eTime - sTime).TotalSeconds + " secondes.");
    // 
    // 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("Le générateur de chaîne a pris " + (eTime - sTime).TotalSeconds + " secondes.");
    // 
    // Maintient la fenêtre de la console ouverte
    // pour que vous puissiez voir les résultats lorsque vous l'exécutez à partir de l'IDE.
    // 
    Console.WriteLine();
    Console.Write("Appuyez sur Entrée pour terminer... ");
    Console.Read();
  3. Enregistrez l'application et appuyez sur la touche F5 pour compiler et exécuter l'application. La fenêtre de console devrait afficher des valeurs similaires aux valeurs suivantes :
    La concaténation a pris 6,208928 secondes.
    Le générateur de chaîne a pris 0 secondes.
    
    Appuyez sur ENTRÉE pour terminer...
  4. Appuyez sur ENTRÉE pour interrompre l'application et fermer la fenêtre de la console.

Dépannage

  • Si vous êtes dans un environnement qui prend en charge la transmission en continu des données, par exemple dans un formulaire Internet ASPX ou votre application qui écrit les données sur le disque, pensez à éviter la surcharge de tampon de concaténation ou StringBuilder et écrivez directement les données dans le flux par le biais de la méthode Response.Write ou la méthode correspondant au flux en question.
  • Essayez de réutiliser la classe StringBuilder existante plutôt que d'en allouer une chaque fois que vous en avez besoin. Cela limite la croissance du tas et réduit la quantité de déchets. Dans tous les cas, contrairement à l'opérateur +, la classe StringBuilder optimise l'utilisation du tas.

RÉFÉRENCES

La classe StringBuilder contient de nombreuses autres méthodes pour la manipulation des chaînes en place. Ces méthodes ne sont pas décrites dans cet article. Pour plus d'informations, effectuez une recherche sur " StringBuilder " dans l'aide en ligne.

















Propriétés

Numéro d'article: 306822 - Dernière mise à jour: lundi 13 octobre 2003 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
kbhowto kbhowtomaster KB306822
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com