Odpovídáte na názor ke článku Chytrý a chytřejší.
„Kdysi jsem se zabýval, prot Microsoft Windows používá volání Call InterlockedIncrement namísto provedení LOCK INC.“
Jednoduše proto, že Microsoft plánuje, plánoval a realizoval časem, že InterlockedIncrement je tzv. instrinsic funkce, tedy falešná funkce.
V 64 bitovém kompilátoru kompilátor nic nevolá, jen rovnou inlinuje co je třeba.
Tedy Microsoft plánoval ve svém kompilátoru, že InterlockedIncrement bude přímo kompilátor nahrazovat inline nejvhodnější implementací. To je to co jste zpozoroval, kompilátor dohazoval jiné věci.
Kromě toho, Microsoft Windows je programováno multiplatfromně, což je hlavní důvod. Většina procesorů, tedy skoro vše kromě x86, nemá instrukci LOCK, nebo jí nemá tak efektivně.
U většiny procesorů se provádí zamykání paměťového místa zvlášť.
Kdysi existovalo Windows NT na Alpha procesory, na MIPS, i na řadu dalších procesorů. Teprve časem to MS zkrouhnul jen na x86 a na Itanium.
Mimochodem, i na to m Itaniu je LOCK, a tedy Interlocked neefektivní, a dokonce to MS uvádí v dokumentaci.
Jinak řečeno, způsob zamykání pro atomické operace je implementačně závislý a každý procesor nabízí jiný způsob.
„Opakuji instrukce s prefixem LOCK je velice drahá, je to serializační instrukce, která způsobí, že se nejprve vyčká, až se dokončí všechn instrukce před ní“
Opakuji, že LOCK je implementačně závislý.
Operace s LOCK je samozřejmě dražší. Protože způsobuje atomičnost zápisu.
Nicméně základní problém, který tu je je – jak moc je drahá a co to stojí. A je skutečně dražší, než Váš kód, nebo levnější?
Vy jste si prostě našel, že LOCK je fuj, a že je NĚJAK drahý, netušíte jak. Tak namísto toho vyrobíte složitější a dražší kód, abyste se v určitých případech LOCK vyhnul. Ale tušíte, jestli jste si polepšil, jestli jste opravdu vylepšil kód?
LOCK není nekonečně drahý. LOCK je nějak měřitelně drahý. Má určitou neefektivitu za kterou nabízí užitečnou funkci – atomičnost operace. Váš kód je také dražší, než efektivita pouhé jediné instrukce na přičtení. Vyplatí se to? Neodpovídám ani nepředjímám, jen dávám otázky.
Osobně bych nenechal programátora v čítači referencí nic rozhodovat. Osobně bych pouze dal jedinou informaci. Program je buď single thread, nebo multi thread. Následně bych měl inline funkci
inline AtomicIncrement(uint32_t volatile * ptr)
{
asm "mov eax, ptr"
#if (PROGRAM == SINGLE_THREAD)
asm "add dword ptr [eax], 1"
#else
...
}
Čímž bych dosáhl vyšší efektivity. A je to nejblíže tomu, co dělá Microsoft v jádře Windows.
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 230×
Přečteno 25 392×
Přečteno 23 814×
Přečteno 20 193×
Přečteno 17 895×