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.Textdella 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

  1. Avviare Visual Studio e quindi creare una nuova applicazione console Visual C#.

  2. Il codice seguente usa gli += operatori di concatenazione e la StringBuilder 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();
    
  3. 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...
    
  4. 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 StringBuildere scrivere i dati direttamente nel flusso tramite il Response.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 della StringBuilder 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.