HOW TO: Migliorare le prestazioni relative al concatenamento delle stringhe in Visual C# .NET


Nel presente articolo viene illustrata una versione beta di un prodotto Microsoft. Le informazioni contenute in questo articolo vengono fornite "nello stato in cui si trovano" e sono soggette a modifiche senza preavviso.

Per questo prodotto beta Microsoft non fornisce alcun tipo di supporto formale. Per informazioni su come ottenere supporto per una versione beta, consultare la documentazione fornita con i file del prodotto beta oppure visitare il sito Web da cui la versione del prodotto è stata scaricata.


Per la versione per Microsoft Visual Basic .NET di questo articolo, vedere 306821 .

CONTENUTO DELL'ATTIVITÀ

Sommario

Nel presente articolo vengono illustrati i vantaggi dell'utilizzo della classe
StringBuilder
rispetto alle tradizionali tecniche di concatenamento. Le stringhe in .NET Framework sono non varianti (ossia il testo a cui si fa riferimento è di sola lettura dopo l'allocazione iniziale). In questo modo, i vantaggi legati alle prestazioni sono numerosi, anche se potrebbero sorgere alcune difficoltà per gli sviluppatori abituati ad utilizzare le tecniche di manipolazione di stringhe di C/C++.


Descrizione di stringhe in .NET Framework

Una tecnica per migliorare il concatenamento di stringhe su
strcat()
in Visual C/C++ consiste nell'allocare una matrice di caratteri di grandi dimensioni come buffer e nel copiare i dati delle stringhe all'interno del buffer. In .NET Framework una stringa è immutabile, ossia non può essere modificata direttamente. L'operatore di concatenamento di C# + crea una nuova stringa, causando prestazioni ridotte quando si effettua il concatenamento di grandi quantità di testo.


In .NET Framework è inclusa tuttavia una classe
StringBuilder
ottimizzata per il concatenamento di stringhe, che offre gli stessi vantaggi dell'utilizzo di una matrice di caratteri in C/C++, oltre ad incrementare le dimensioni del buffer (se necessario) e a registrare la lunghezza. L'applicazione di esempio del presente articolo consente di illustrare l'utilizzo della classe
StringBuilder
e di confrontare le prestazioni relative al concatenamento.


Creazione ed esecuzione di un'applicazione di esempio

  1. Avviare Visual Studio .NET e creare una nuova applicazione console di Visual C#.
  2. Il codice riportato di seguito utilizza l'operatore di concatenamento += e la classe
    StringBuilder
    per calcolare 5.000 concatenamenti di 30 caratteri ciascuno. Aggiungere il codice alla procedura Main.
    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. Salvare l'applicazione e premere il tasto F5 per compilarla ed eseguirla. Nelle finestre della console verrà visualizzato un output analogo al seguente:

    Concatenation took 6.208928 seconds.
    String Builder took 0 seconds.

    Press ENTER to finish ...
  4. Premere INVIO per interrompere l'esecuzione dell'applicazione e chiudere la finestra Console.

Risoluzione dei problemi

  • Se si è all'interno di un ambiente che supporta flussi di dati, ad esempio un modulo Web ASPX, o se l'applicazione esegue la scrittura di dati su disco, prendere in considerazione la possibilità di evitare un sovraccarico del buffer relativo al concatenamento o l'utilizzo della classe
    StringBuilder
    e scrivere invece i dati direttamente nel flusso mediante il metodo
    Response.Write
    o il metodo appropriato per il flusso in questione.
  • Cercare di riutilizzare la classe
    StringBuilder
    esistente invece di riallocarne una ogni volta che è necessario. In questo modo è possibile limitare le dimensioni dell'heap e ridurre le operazioni di raccolta nel Garbage Collector. In entrambi i casi, l'utilizzo della classe
    StringBuilder
    rende più efficace l'utilizzo dell'heap rispetto all'uso dell'operatore +.

RIFERIMENTI

Nella classe
StringBuilder
sono contenuti numerosi altri metodi per la manipolazione diretta di stringhe non descritti nel presente articolo. Per ulteriori informazioni, effettuare una ricerca relativa a "StringBuilder" all'interno della Guida in linea.


















Proprietà

ID articolo: 306822 - Ultima revisione: 07 apr 2003 - Revisione: 1

Feedback