utorok, 16. marca 2010

.Net string alebo StringBuilder?

Včera mi kamarát dal "hádanku" ako z :

           var list = new string[] { "Jozef", "Roman", "Palo" };

najjednoduchšie spravím :

           "Jozef, Roman, Palo"

Mňa samozrejme hneď napadol foreach prístup. No ale viem že on sleduje .Net a číta si o ňom viac ako ja. Takže som vedel, že foreach nie je to čo má byť ako výsledok. Výsledok bol toto :

           list.Aggregate((a, b) = a + ", " + b);

Čo je zaujímavý a rýchly spôsob ako rozumne niečo vypísať. Mňa ale hneď nejak začalo trápiť aké rýchle to je. Skúsil som štyri rôzne prístupy a tu sú výsledky

  list.Aggregate((a, b) = a + ", " + b);3101,8578ms
string r = "";
f = false;
foreach (string s in list)
{
      if (f)
            r += ", ";
      else
            f = true;
      r += s;
}
5952,7529ms
string r = "";
f = false;
foreach (string sc in list)
{
      if (f)
            r2 += ", " + sc;
      else
      {
            r2 += sc;
            f = true;
      }
}
                     2974,5727ms
StringBuilder sb = new StringBuilder();
bool f = false;
foreach (string sc in list)
{
      if (f)
            sb.Append(", ");
      else
            f = true;
      sb.Append(sc);
}
2,3295ms


Pokus som robil na liste s 20000 prvkami. Pričom každý prvok bol náhodný text dlhý od 5 do 14 znakov.

Neviem prečo, ale ja som mal domnienku, že v .Nete je za stringom vlastne StringBuilder. Ako vidno tak to nie je pravda a string je v tomto konkrétnom prípade až 1277 krát rýchlejší.
Čo ma tiež prekvapilo bol rozdiel medzi foreach stringovou metódou a Aggregate a ten je minimálny.Čakal som väčší rozdiel.

Na záver môžem povedať, že do debugovacích výpisov kľudne použijem Aggregate lebo je prehľadná a "spratná". Ale ak pôjde o skladanie väčšieho počtu reťazcov tak určite siahnem bo StringBuilder.

Žiadne komentáre:

Zverejnenie komentára