Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

August 10, 2007 / by Zsolt Soczó

Melyik a gyorsabb?

És miért?

[source:C#]
Stopwatch st = Stopwatch.StartNew();
char a = ‘1’;
char b = ‘a’;
for (int i = 0; i < 1000 * 1000 * 10; i++) { //string s1 = new string(new char[] { a, b }); //string s2 = a.ToString() + b.ToString(); } st.Stop(); Console.WriteLine(st.Elapsed); [/source]

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

3 COMMENTS

  • kaz August 11, 2007

    Talán azért gyorsabb, mert kevesebb objektum létrehozás kell a tömbös verzióhoz?
    1 eset: 2 objektum (char[], string)
    2 eset: 3 ojjektum (string, string, string)
    Illetve a concat függvénynél hatékonyabb lehet a konstruktor (a Reflectorral nem kinyerhető a forrása).

  • kpocza August 12, 2007

    Szerintem is az első gyorsabb.
    Az első esetben létre kell hozni egy 2 elemű tömböt (newarr IL utasítással), majd ezt a két elemet feltölteni (local stack műveletek). Mindenre van egyszerű IL utasítás. Ezután egy string(char[]) konstruktort kell hívni, ami natív kód, tehát valószínűleg hatékony.

    A második esetben mindkét char-on meg kell hívni a ToString-et. A reflector szerint ez bizony egy new string(c, 1) konstruktorhívással végződik (szintén nincs reflectorral elérhető forrás, ez még hatékony).
    Majd pedig létre kell hozni a két string konkatenációja miatt egy újabb string példány a string Concat műveletében A Concat művelet a Reflector szerint eléggé bonyolul:
    – Csomó feltétel
    – Mindenféle függvényhívás
    – 2-szer rá kell jönnie a 6. feltétel (while is feltétel) kiértékelése után, hogy 1 character hosszú string-et hogyan kell átmásolni.

    A string bizony egy immutable típus, ami azt jelenti, hogy amilyen értéket egy példány legelőször felvett, az marad továbbra is az értéke. Pl. ha egy a+=b; műveletet végzünk két stringgel, akkor lesz egy olyan “elveszett” ‘a’ példányunk a memóriában, amiről a gc fog gondoskodni. Tehát a második esetben még optimalizálni sem tudna az a.ToString() példány s2-ként való újrahasznosításával.

  • Péter November 26, 2007

    Szervusz!
    Nem tudom kérhetek-e segítséget. Telepitenem kéne a Visual C++ 2005 Redistributable programot, de install kezdete után command line opcion syntax error /? hibaüzenetet kapok és a telepités megszakad. Nem használnám a programot csak a Nokia update program szeretné használni.
    Már mindenhol keresgéltem, de megoldást nem találtam.
    Win xp sp2 az alap. Ha tudsz segiteni köszönön. Péter