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

Traduzione articoli Traduzione articoli
Identificativo articolo: 306822 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato precedentemente pubblicato con il codice di riferimento I306822
Espandi tutto | Chiudi tutto

In questa pagina

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à

Identificativo articolo: 306822 - Ultima modifica: martedì 8 aprile 2003 - Revisione: 1.0
Le informazioni in questo articolo si applicano a
  • Microsoft Visual C# .NET 2002 Standard Edition
Chiavi: 
kbhowto kbhowtomaster KB306822
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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