Pracuję nad kompilatorem, który emituje kod IL. Ważne jest, aby wynik IL był JIT zwany najszybszym możliwym kodem maszynowym przez kompilatory Mono i Microsoft .NET JIT.Optymalizacja IL dla kompilatorów JIT
Moje pytania są następujące:
Czy jest sens, aby zoptymalizować wzory jak:
'stloc.0; ldloc.0; ret' => 'ret' 'ldc.i4.0; conv.r8' => 'ldc.r8.0'
i takie, lub są JIT jest wystarczająco inteligentny, aby dbać o nich?
Czy istnieje specyfikacja z listą optymalizacji wykonanych przez kompilatory JIT firmy Microsoft/Mono?
Czy istnieje dobry odczyt z praktycznymi zaleceniami/najlepszymi praktykami optymalizacji IL, aby kompilatory JIT mogły z kolei generować najbardziej optymalny kod maszynowy (pod względem wydajności)?
Z tego, co zbieram, JIT jest całkiem dobry w eliminowaniu 'stloc.0; ldloc.0; '. W przypadku IronScheme, próbowałem zmodyfikować wyjściowy il tak, aby był podobny do C#, opierając się na przekonaniu, że JIT prawdopodobnie będzie starał się zoptymalizować znane wzorce. Ale to tylko uczucie: D Zawsze możesz po prostu stworzyć mikrobenki, żeby je zmierzyć. – leppie
. Jittery .NET nie są szczególnie inteligentne (w końcu nie mają zbyt wiele czasu). Dlaczego zależy ci na "najszybszym możliwym"? – Luaan
@Luaan, zależy mi na "najszybszym możliwym", ponieważ jest to kompilator, który musi wytworzyć kod do intensywnych obliczeń. Najlepiej byłoby, gdyby tworzył natywny kod maszynowy, ale myślę o IL dla lepszej przenośności i łatwości konserwacji. Jednak wydajność nadal jest najwyższym priorytetem. –