No, pro ilustraci přikládám ASM, které ten .NETový prográmek spouští na procesoru (pozor, aplikace se nesmí pustit přímo přes VS, jinak je JIT optimalizace úplně vypnutá; je nutné pustit aplikaci zvlášť a attachnout se k ní z debuggeru až po spuštění).
00000006 xor eax,eax
{
00000008 inc esi
00000009 inc eax
0000000a cmp eax,5F5E0FFh
0000000f jl 00000008
}
Je tu jasně vidět, že ano, .NET skutečně umí používat registry (to je mi překvapení). C++ kompilátor je skutečně odvážnější (například otočil cyklus tak, aby mohl používat jne místo jl), ale skutečně nedochází k ničemu tak tragickému, jako že by se inkrementace integeru prováděla v paměti.
Nutno podotknout, že jsem toto skoušel na MS JIT, nikoliv na Mono. Mono je rozhodně ve spoustě kódu mnohem pomalejší.
A velká část .NETu (včetně C#) je napsána v C#, většina v Simple Managed C (také .NET jazyk) a jen pár kritických míst v C/++ resp. ASM. Mono je napsané v C# celé, a i MS má kompletní C# kompilátor napsaný v C# (Roslyn).
Největší nevýhoda C# je zároveň i v jiných věcech velkou výhodou - a jde o ten JIT kompilátor. To znamená, že záleží na konkrétním JIT kompilátoru jak chytře bude kód optimalizovaný, a navíc musí JIT šetřit optimalizacemi, protože na ně má málo času. Windowsácký MS JIT kompilátor je výborný, Mono je na tom výrazně hůř. Každopádně tam pořád zůstává to kritické - .NET umožňuje napsat 99% aplikace snadno a bezpečně, a pro to 1% výkonově kritického kódu dokáže používat stejné prasárny, jako C/ASM.