Al momento sei offline in attesa che la connessione Internet venga ristabilita

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

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I306822
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 classeStringBuilderrispetto 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++.

Torna all'inizio

Descrizione di stringhe in .NET Framework

Una tecnica per migliorare il concatenamento di stringhe sustrcat()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 classeStringBuilderottimizzata 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 classeStringBuildere di confrontare le prestazioni relative al concatenamento.

Torna all'inizio

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 classeStringBuilderper 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.
Torna all'inizio

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 classeStringBuildere scrivere invece i dati direttamente nel flusso mediante il metodoResponse.Writeo il metodo appropriato per il flusso in questione.
  • Cercare di riutilizzare la classeStringBuilderesistente 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 classeStringBuilderrende più efficace l'utilizzo dell'heap rispetto all'uso dell'operatore +.
Torna all'inizio

RIFERIMENTI

Nella classeStringBuildersono 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.

Torna all'inizio















Proprietà

ID articolo: 306822 - Ultima revisione: 04/08/2003 15:13:00 - Revisione: 1.0

Microsoft Visual C# .NET 2002 Standard Edition

  • kbhowto kbhowtomaster KB306822
Feedback