Odpovídáte na názor ke článku Chytrý a chytřejší.
@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
//InterlockedIncrement
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 InterlockedIncrement, ž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!!!
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 37 774×
Přečteno 26 420×
Přečteno 24 932×
Přečteno 21 278×
Přečteno 18 932×