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?
W ogólnym przypadku nie powinieneś mieć nadziei na optymalizację kompilatora. – oakio