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
Start Visual Studio en maak vervolgens een nieuwe Visual C#-consoletoepassing.
In de volgende code worden de
+=
samenvoegingsoperatoren en deStringBuilder
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();
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...
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
StringBuilder
te vermijden en de gegevens rechtstreeks naar de stroom te schrijven via deResponse.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 deStringBuilder
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.
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor