次のコード スニペット、実行効率の観点から、single の 3 次元配列のトラバーサルを考えてみましょprocess1()
うprocess2()
。
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]); }
現在、C# は .NET フレームワークの配列を行優先の構造体として編成することが知られています。最適化を行わない場合、最初のループは 2 番目のループよりもはるかに高速に実行されると想定します。
問題は、CLR の JIT または cs.exe/vb.exe コンパイラが、このようなループを検出して最適化し、おそらくネストを並べ替えているか、または、特に何が起こるかという点で、潜在的なパフォーマンス ヒットを常に警戒する必要があるかどうかです。ループを並列化しようとしたら?