Odpověď na názor

Odpovídáte na názor ke článku Chytrý a chytřejší.

  • 4. 11. 2011 16:27

    ondra.novacisko.cz (neregistrovaný)

    @8 Sorry, ale proč mi to říkáte. Mne nemusíte učit C++ a ani jsem v příspěvku toto neřešil. Řešil jsem jen to, že nevěřím tomu, že počítání referenci je rychlejší v řízeném kódu než v nativním. Pokud něco takového vy nebo autor (nevím, kdo je kdo) pozorujete, pak máte někde chybu. Nedivil bych se, kdyby chyba byla v STL. Co se týče chytrých ukazatelů a počítání referenci, schválně jsem se podíval, jak vypadá kopírování počítaného ukazatele v mé verzi chytrého ukazatele. K tomu dodám, že má verze řeší separátně počítání v režimu MT a ST, proto je následující kód lehce delší:

    //kopírování adresy
    00E2D2E7 mov dword ptr [esi],edi

    //test zda to není NULL
    00E2D2E9 test edi,edi
    00E2D2EB je 0E2D308h

    //test zda čítač nemá horní bit nastaven na 1 - ST, nebo 0 - MT
    00E2D2ED mov eax,dword ptr [edi]
    00E2D2EF test eax,eax
    00E2D2F1 js 0E2D305h

    //MT verze
    00E2D2F3 mov dword ptr [esp+34h],1
    00E2D2FB mov ecx,dword ptr [esp+34h]
    00E2D2FF push ecx
    00E2D300 push edi
    //InterlockedIn­crement
    00E2D301 call ebx
    00E2D303 jmp 0E2D308h

    //ST verze
    00E2D305 inc eax
    00E2D306 mov dword ptr [edi],eax

    //to je vše.
    Tento kód je nainlinován na každé místo, kde se pointer kopíruje. Žádné volání kopírovacích konstruktorů

    Uměl byste vyšvihnout rychlejší kód? U testů lze provést ještě optimalizaci tak, aby se chytal dobře odhad skoků, pak je dobré, když procesor v režímu ST odhaduje správně (v režimu MT je tak velký overhead na InterlockedIn­crement, že neuhodnutí skoku je proti tomu prd)

    A ještě se vrátím k tomu článku a k uvedenému kódu. Autor stvořil nádhrerny proxy pointer, který nazval nevhodně jako Shared. Ve skutečnosti to vypadá

    Ref->SharedPtr->T

    Při každém přístupu dochází k dvojnásobné dereferenci, tedy k dvojnásobné pravděpodobnosti výpadku stránky z procesorový cache. Osobně se divím, že je to prý rychlejší. Spíš bych se zaměřil na chybu v testovacím algoritmu, který pravděpodobně nahrává jedné straně. A proboha lidi, nepoužívejte shared_ptr!!!