Single byte string in C#
This post was originally published on Coding Glamour.
Definitie van een string
In .NET is een string een verzameling karakters in Unicode. Hierdoor zijn
er twee bytes per karakter nodig, plus twee bytes voor het aantal karakters
in de string.
Voordeel hiervan is dat bijna alle karakters in een string kunnen voorkomen.
Nadeel is dat wanneer je alleen 'eenvoudige' karakters gebruikt
(geen fancy tekens als á of U+263A) dat je twee keer zoveel geheugen
alloceert dan eigenlijk nodig is. Normaal geen enkel probleem.
Maar als geheugengebruik kritisch is?
Wanneer je geheugengebruik een belangrijk punt van je applicatie is, en
er bovendien veel (en ik bedoel hier véél) strings hebt, dan
kan het geheugengebruik een probleem worden. Oplossing is om je strings
op te slaan als arrays van 'bytes' in plaats van 'char'.
Een byte heeft namelijk een width van 1 byte (what's in a name). Je
kunt dan alleen wel maximaal 255 verschillende karakters gebruiken in je
strings.
Implementatie
Hieronder een simpele implementatie van bovenstaand principe met een voorbeeldimplementatie
van 'StartsWith' en 'Equals':
Performance
Om ook iets zinnigs te kunnen zeggen over de performance hebben we een
testje nodig! Even 1.000.000 miljoen strings vergelijken (bovenstaande
implementatie van 'StartsWith' tegen de native 'String.StartsWith').
Dus?
Performance is wat minder, maar het geheugengebruik scheelt aanzienlijk
(in onze case van 300 MB -> 190 MB). De performance-loss is weliswaar
+20% maar in de praktijk niet merkbaar. Mocht je dus ooit tegen dit probleem
aanlopen; het kán een oplossing zijn maar wel met een prijs.
There are 14 comments on this article, read them on Coding Glamour.