[C#] Performance String Concatenation

Pagina: 1
Acties:

  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Kan iemand voor mij de discussie doorbreken: wat is, in welke situatie, het snelst?

- String1 + String2
- String1.Concat(String2)
- String.Format("{0}{1}", String1, String2)
- StringBuilder klasse gebruiken

Volgensmij heb ik ergens gelezen dat de compiler String1 + String2 vertaalt naar String1.Concat(String2) dus die staan op gelijke voet.

Moet ik nadenken over de performance als ik moet kiezen tussen (ook bij grootschalige situaties):
code:
1
2
3
   String a = "a"';
   String b = "b";
   String c = "a" + "b";


code:
1
2
3
   String a = "a"';
   String b = "b";
   String c = String.Format("{0}{1}", a, b);


code:
1
2
3
4
5
6
   String a = "a";
   String b = "b";
   StringBuilder sb = new StringBuilder(a)
   sb.Append(b);

   // String c is dan te verkrijgen door sb.ToString();


(BTW, als iemand serieus goede performance tips heeft, aarzel niet ze te posten)

[ Voor 13% gewijzigd door Zyphrax op 04-11-2004 23:50 ]

Any sufficiently advanced technology is equivalent to magic.


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 21:33

BCC

Waarom wil je dit precies weten? Ik heb nl. tot nu toe eigenlijk nog nooit een performance issue gehad met C#.. helemaal niet met String concats.. Ik zou zeggen dat de eerste het snelst is, omdat er geen nieuwe objecten gecreerd worden... Maar waarom bouw je niet even een mooi for loopje en laat je het C# even fijn zelf uitrekenen :)?

[ Voor 107% gewijzigd door BCC op 04-11-2004 23:57 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Kun je niet een array maken met strings en die dan imploden / join? Dit is in Veel talen het snelst. Probeer gewoon eens, zoals BCC zegt.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

De laatste is het snelst. Waarom, lees hier.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Een StringBuilder kan sneller zijn.....

Als je 2 strings met elkaar wilt concatten, dan is een stringbuilder niet het snelst. De overhead die nodig is om een StringBuilder object te creeëren is nl. groter dan de performance winst die de stringbuilder haalt om strings te concatten.
Als je echter een hele hoop strings moet concatten, en dit zo doet:
code:
1
2
3
4
5
string s = string.Empty;
for( int i = 0; i < 1000; i ++ )
{
    s += i.ToString();
}

Dan is een StringBuilder sneller.

Echter, als je een string zo concat:
code:
1
string s = "blaat " + "blaat " + "miep" + "melp" + "zwiep" + "pow";

Dan zal dit ook sneller zijn dan een StringBuilder.

https://fgheysels.github.io/


Verwijderd

whoami schreef op 05 november 2004 @ 08:34:
Echter, als je een string zo concat:
code:
1
string s = "blaat " + "blaat " + "miep" + "melp" + "zwiep" + "pow";

Dan zal dit ook sneller zijn dan een StringBuilder.
Ja, dat laatste is nogal logisch! Bij het laatste voorbeeld wordt er helemaal niet runtime ge-concat. De compiler genereerd in dit geval gewoon een string litral.

code:
1
string s = "blaatblaatmiepmelpzwieppow";

Verwijderd

Bij het concatten van een vast aantal strings is
code:
1
c = a + b + "weet ik veel"


het snelst.

Bij het concatten van een onbekend aantal strings is de stringbuilder het snelst, al kan ik mij voorstellen dat het concatten van een onbekend aantal wat nooit meer dan bv. 5 zal zijn, de overhead van het creeeren van de stringbuilder niet opweegt tegen het her-alloceren van geheugen (oftwel dan zou de sb langzamer kunnen zijn)

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Je moet natuurlijk zeker rekening houden met de overhead. Daarvoor hebben we profilers, je moet zelf even kijken in hoevere je een process kan optimalizeren, een StringBuilder kan hierbij helpen, maar kan het process ook verslomen.

Je zou dit zelf even moeten uitzoeken voor je eigen process en met een profiler kun je dit goed doen.

Als je veel string concatten hebt kan een StringBuilder een bottleneck uit de weg ruimen maar kan het ook juist weer veroorzaken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het beste tel je eerst alle lengtes van strings op, vervolgens alloceer je iets van voldoende grote (ik heb geen ervaring met C#, maar StringBuilder zal wel een Reserve functie hebben oid), en daarna ga je alle strings daarnaartoe appenden.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 05 november 2004 @ 11:24:
vervolgens alloceer je iets van voldoende grote (ik heb geen ervaring met C#, maar StringBuilder zal wel een Reserve functie hebben oid)
Bij het creeeren van het object kan je een initial size neerzetten. Bij arraylists weet ik dat als de size vergroot moet worden, dit met een factor 2 gebeurd. Dus een array van 2 items initieel, wordt bij item nr 3 4 groot, bij item nr 5 8 groot, enz. enz.
Pagina: 1