Visual C# gebruiken om de prestaties van tekenreekssamenvoeging te verbeteren

Dit artikel bevat informatie over het verbeteren van de prestaties van tekenreekssamenvoeging in Visual C#.

Oorspronkelijke productversie: Visual C#
Origineel KB-nummer: 306822

Samenvatting

In dit artikel ziet u de voordelen van het gebruik van de StringBuilder klasse ten opzichte van traditionele samenvoegingstechnieken. Tekenreeksen in de Microsoft-.NET Framework zijn invariant (de tekst waarnaar wordt verwezen, is na de eerste toewijzing alleen-lezen). Het biedt veel prestatievoordelen en vormt een aantal uitdagingen voor de ontwikkelaar die gewend is aan C/C++-tekenreeksmanipulatietechnieken.

Dit artikel verwijst naar de naamruimte System.Text.NET Framework Class Library .

Beschrijving van tekenreeksen in de .NET Framework

Een techniek om de samenvoeging strcat() van tekenreeksen in Visual C/C++ te verbeteren, is door een grote tekenmatrix toe te wijzen als buffer en tekenreeksgegevens naar de buffer te kopiƫren. In de .NET Framework is een tekenreeks onveranderbaar. Deze kan niet worden gewijzigd. De C# + -samenvoegingsoperator bouwt een nieuwe tekenreeks en zorgt voor verminderde prestaties wanneer deze grote hoeveelheden tekst samenvoegt.

De .NET Framework bevat echter een StringBuilder klasse die is geoptimaliseerd voor tekenreekssamenvoeging. Het biedt dezelfde voordelen als het gebruik van een tekenmatrix in C/C++, het automatisch vergroten van de buffergrootte (indien nodig) en het bijhouden van de lengte voor u. De voorbeeldtoepassing in dit artikel demonstreert het gebruik van de StringBuilder klasse en vergelijkt de prestaties met samenvoeging.

Een demonstratietoepassing bouwen en uitvoeren

  1. Start Visual Studio en maak vervolgens een nieuwe Visual C#-consoletoepassing.

  2. In de volgende code worden de += samenvoegingsoperatoren en de StringBuilder klasse gebruikt om 5000 samenvoegingen van elk 30 tekens te timen. Voeg deze code toe aan de hoofdprocedure.

    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. Sla de toepassing op. Druk op F5 om de toepassing te compileren en vervolgens uit te voeren. De consolevensters moeten uitvoer weergeven die vergelijkbaar is met de voorbeelden:

    Concatenation took 348 ms.
    String Builder took 0 ms.
    Press ENTER to finish...
    
  4. Druk op Enter om het uitvoeren van de toepassing te stoppen en het consolevenster te sluiten.

Probleemoplossing

  • Als u zich in een omgeving bevindt die ondersteuning biedt voor het streamen van de gegevens, zoals in een ASPX-webformulier of als uw toepassing de gegevens naar de schijf schrijft, kunt u overwegen om de bufferoverhead van samenvoeging of de StringBuilderte vermijden en de gegevens rechtstreeks naar de stroom te schrijven via de Response.Write methode of de juiste methode voor de betreffende stream.

  • Probeer de bestaande StringBuilder class opnieuw te gebruiken in plaats van telkens opnieuw te toewijzen wanneer u er een nodig hebt. Dat beperkt de groei van de heap en vermindert de garbagecollection. In beide gevallen maakt het gebruik van de StringBuilder klasse efficiĆ«nter gebruik van de heap dan het gebruik van de + operator.

Verwijzingen

De StringBuilder klasse bevat veel andere methoden voor in-place tekenreeksmanipulatie die niet in dit artikel worden beschreven. Zoek naar StringBuilder in de Online Help voor meer informatie.