Zauważyłem, że jitter C# wytwarza wymiernie wolniejszy kod niż kompilator C++, nawet jeśli nie ma użytych konstruktów "managed overhead" (takich jak tablice z sprawdzonym indeksowaniem).Udoskonalenia jittera C# w przyszłych wersjach frameworków
kwantyfikowania, że czasowe następujące proste pętli:
public static int count = 1000000000;
public static int Main()
{
int j = 0;
for (int i = 0; i < count; ++i)
{
j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7);
}
return j;
}
Ta pętla zaczyna 3.88s Wykonywanie (sporządzoną w/o). Równoważna pętla skompilowana z VC 2010 (-O2) zajmuje 2,95s.
Aby sprawdzić, czy faktycznie wygenerowano niższy kod, porównałem kody maszynowe: utworzono listing (/ FA) z kompilatora VC i dołączono debugger do programu C# (po zakończeniu pętli).
Rzeczywiście, wersja C++ używa pewnych sprytnych sztuczek. Na przykład, aby uniknąć kosztownego mnożenia przez 7, istnieje osobny rejestr, który jest zwiększany o 7 na każdą liczbę pętli. Wersja C# wykonuje mnożenie (imul) za każdym razem. Są też inne różnice.
Rozumiem, że jitter C# ma znacznie mniej czasu na skompilowanie kodu w czasie wykonywania niż VC w czasie kompilacji. Ale np. Jitter Java dynamicznie optymalizuje często używane metody. C# nie wydaje się tego robić.
Moje pytanie brzmi: czy planowane są ulepszenia jittera C# w przyszłych wersjach frameworków?
Visual Studio RC 2012 z .NET 4.5 jest dostępne do pobrania od wczoraj. Pobierz go (to nic nie kosztuje) i uruchom tam ten sam test. –
Przestałem wstrzymywać oddech na nowe optymalizacje zrobione przez jittera dawno temu. MS wydaje się myśleć, że jest wystarczająco dobre w tym dziale. – harold
@harold Od kiedy? –