Soci (Soczó Zsolt) szakmai blogja

2007.08.10.

Melyik a gyorsabb?

Filed under: .NET,C#,Szakmai élet — Soczó Zsolt @ 16:19

É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]

3 Comments

  1. 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).

    Comment by kaz — 2007.08.11. @ 20:16

  2. 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.

    Comment by kpocza — 2007.08.12. @ 13:59

  3. 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

    Comment by Péter — 2007.11.26. @ 11:57

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress