Konkatenering i .net

Det finns tillfällen du behöver konkatenera strängar. Det kan exempelvis röra sig om en loop som skall bygga en sträng.

När du skall konkatenera skall du använda dig av stringbuilder – System.Text.StringBuilder(). Den är mycket snabbare än ”vanlig” konkatenering, vilket du kommer att se snart.

string str = string.Empty;
for (int i = 1; i < 100000; i++) { str = str + i.ToString(); }[/sourcecode] Ovanstående kodsnutt exekverar på 2 minuter och 29 sekunder lite drygt. [sourcecode lang="csharp"]StringBuilder sb = new StringBuilder(); for (int i = 1; i < 100000; i++) { sb.Append(i.ToString()); }[/sourcecode] Ovanstående kod exekverar på lite drygt 0,078 sekunder. Hur kan det skilja sig så otroligt mycket kanske du tänker nu. Du har många gånger konkatenerat enligt den översta metoden och har inte upplevt prestandaproblem. Det är så att för varje konkatenering så skapas en ny sträng bestående av den gamla strängen och den nya. Det är alltså inte - som man kan tro - att den lägger till strängen till den befintliga. Efter att den har skapat en ny sträng och allokerat minne för detta så raderas den gamla strängen ur minnet. Som du kan förstå så är detta ett mycket mödosamt arbete för datorn, att hela tiden radera och allokera minne om och om igen - för varje tecken. StringBuilder fungerar istället som så att när du instansierar den så allokerar den minne för 16 tecken och för varje tillägg så behöver den inte allokera nytt minne eftersom det redan finns allokerat. Om man lägger till fler än 16 tecken kommer den att allokdera 32 tecken och överskrider man 32 tecken så allokeras 64 - upp till Int32.MaxValue. StringBuilder har även ett antal konstruktorer, bland annat kan du direkt vid instansieringen styra hur mycket minne som skall allokeras med hjälp av att ange antal tecken som du tror att din kommande sträng kommer att bestå av. Du kan även ställa in max antal tecken som din sträng får bestå av och om detta överskrids så kastas ett undantag. Nu är det inte jättevanligt att man konkatenerar 100000 strängar på samma gång, men oavsett vilket så är det märkbara skillnader i hur mycket garbage collection behöver jobba och hur mycket minne som används redan vid väldigt få konkateneringar. När man skall konkatenera färre strängar så skall man använda String.Concat. Exempelvis: [sourcecode lang="csharp"]string text = String.Concat("t", "e", "s", "t");[/sourcecode] De tester som jag har gjort visar att String.Concat är snabbare och tar mindre minne än StringBuilder upp till 5-6 konkateneringar. Om man skall konkatenera fler än 5-6 strängar så skall istället StringBuilder användas.

Kommentarer inaktiverade.

%d bloggare gillar detta: