2013-07-17 12 views
5

Rozważmy następujący fragment kodu, a przechodzenie z trójwymiarowej tablicy singli pod względem efektywności wykonania, przy założeniu, że process1() i process2() wziąć identyczne okresy czasu, aby wykonać:.NET Compiler - Czy wbudowane są zagnieżdżone optymalizacje pętli?

float arr[mMax,nMax,oMax]; 

for (m = 0; m < mMax; m++) 
    for (n = 0; n < nMax; n++) 
    for (o = 0; o < oMax; o++) 
     { process1(arr[m,n,o]); } 

for (o = 0; o < oMax; o++) 
    for (n = 0; n < nMax; n++) 
    for (m = 0; m < mMax; m++) 
     { process2(arr[m,n,o]); } 

teraz, to wiadomo, że C# porządkuje tablice w środowisku .NET jako struktury wielowierszowe. Bez optymalizacji założyłbym, że pierwsza pętla wykona znacznie szybciej niż druga.

Pytanie brzmi: Czy kompilatory JIT CLR lub cs.exe/vb.exe wykrywają i optymalizują pętle w ten sposób, prawdopodobnie zmieniając kolejność zagnieżdżania, czy też zawsze powinienem być ostrożny w poszukiwaniu potencjalnych wyników wydajności, szczególnie pod względem co by się stało, gdybym próbował zrównoleglić pętle?

+2

W ogólnym przypadku nie powinieneś mieć nadziei na optymalizację kompilatora. – oakio

Odpowiedz

3

Jest to rodzaj optymalizacji, którą można może oczekiwać w kompilatorze C lub C++. W rzeczywistości jest raczej aktualny, ta dokładna optymalizacja została wspomniana w this video sesji Build 2013. Chociaż jest on przeznaczony dla programistów C/C++, to wiele informacji, które są tam omawiane, jest również interesujące dla programistów C#. Ograniczenia podsystemu pamięci są równie istotne. Nie jestem pewien, czy optymalizacja wprowadziła go do VS2013, iirc wystąpił problem z jego zbytnim spowolnieniem natywnego kompilatora.

Ale nie, optymalizator jittera działa na bardzo napięty budżet. Wydawanie zbyt dużej ilości czasu powoduje zauważalne opóźnienia w uruchamianiu i wstrzymuje wykonanie, więc nie może pozwolić sobie na tego rodzaju analizę. Programiści C# muszą to zrobić sami.

+0

Film jest fascynujący; dzięki za połączenie z tym. Mam jednak wrażenie, że grupa programistów kompilatora C# nie jest wystarczająco zintegrowana z grupą programistów C/C++, aby zapewnić, że te optymalizacje są w przygotowaniu. Zgodziłbyś się z tym? –

Powiązane problemy