Usare Visual C# per migliorare le prestazioni di concatenazione delle stringhe
Questo articolo fornisce informazioni su come migliorare le prestazioni di concatenazione delle stringhe in Visual C#.
Versione originale del prodotto: Oggetto visivo C#
Numero KB originale: 306822
Riepilogo
Questo articolo illustra i vantaggi dell'uso della classe rispetto alle StringBuilder
tecniche di concatenazione tradizionali. Le stringhe in Microsoft .NET Framework sono invarianti, ovvero il testo a cui si fa riferimento è di sola lettura dopo l'allocazione iniziale. Offre molti vantaggi in termini di prestazioni e pone alcune difficoltà allo sviluppatore che è abituato alle tecniche di manipolazione delle stringhe C/C++.
Questo articolo fa riferimento allo spazio dei nomi System.Text
della libreria di classi .NET Framework.
Descrizione delle stringhe in .NET Framework
Una tecnica per migliorare la concatenazione strcat()
di stringhe in Visual C/C++ consiste nell'allocare una matrice di caratteri di grandi dimensioni come buffer e copiare i dati stringa nel buffer. In .NET Framework una stringa non è modificabile e non può essere modificata sul posto. L'operatore di concatenazione C# +
crea una nuova stringa e riduce le prestazioni quando concatena grandi quantità di testo.
Tuttavia, .NET Framework include una StringBuilder
classe ottimizzata per la concatenazione di stringhe. Offre gli stessi vantaggi offerti dall'uso di una matrice di caratteri in C/C++, dall'aumento automatico delle dimensioni del buffer (se necessario) e dal rilevamento della lunghezza. L'applicazione di esempio in questo articolo illustra l'uso della StringBuilder
classe e confronta le prestazioni con la concatenazione.
Compilare ed eseguire un'applicazione dimostrativa
Avviare Visual Studio e quindi creare una nuova applicazione console Visual C#.
Il codice seguente usa gli
+=
operatori di concatenazione e laStringBuilder
classe per la durata di 5.000 concatenazioni di 30 caratteri ciascuno. Aggiungere questo codice alla procedura principale.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();
Salvare l'applicazione. Premere F5 per compilare e quindi eseguire l'applicazione. Le finestre della console dovrebbero visualizzare un output simile agli esempi:
Concatenation took 348 ms. String Builder took 0 ms. Press ENTER to finish...
Premere INVIO per interrompere l'esecuzione dell'applicazione e chiudere la finestra della console.
Risoluzione dei problemi
Se ci si trova in un ambiente che supporta lo streaming dei dati, ad esempio in un Web form ASPX o se l'applicazione scrive i dati su disco, è consigliabile evitare il sovraccarico del buffer della concatenazione o
StringBuilder
e scrivere i dati direttamente nel flusso tramite ilResponse.Write
metodo o il metodo appropriato per il flusso in questione.Provare a riutilizzare l'oggetto esistente
StringBuilder class
anziché riassegarlo ogni volta che ne è necessario uno. Ciò limita la crescita dell'heap e riduce la Garbage Collection. In entrambi i casi, l'uso dellaStringBuilder
classe rende più efficiente l'uso dell'heap rispetto all'uso dell'operatore+
.
Riferimenti
La StringBuilder
classe contiene molti altri metodi per la manipolazione di stringhe sul posto che non sono descritti in questo articolo. Per altre informazioni, cercare StringBuilder
nella Guida online.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: nel corso del 2024 verranno dismessi i problemi di GitHub come meccanismo di feedback per il contenuto e verranno sostituiti con un nuovo sistema di feedback. Per altre informazioni, vedere:Invia e visualizza il feedback per