C# は 1D 配列にアクセスするために "最適化されている" (要素にアクセスする関数を呼び出さない) ことを見てきましたが、multidim-arrays 関数の GetValue は毎回呼び出されます。「通常の」アクセス (ポインターのシフト + チェック) が実装されていないか、少なくともこの関数がフラット化されていないたびに、この関数を呼び出す代わりに、なぜですか?
論理的な理由が見つかりません。(multidim-arrays のパフォーマンスは良くありません)
C# は 1D 配列にアクセスするために "最適化されている" (要素にアクセスする関数を呼び出さない) ことを見てきましたが、multidim-arrays 関数の GetValue は毎回呼び出されます。「通常の」アクセス (ポインターのシフト + チェック) が実装されていないか、少なくともこの関数がフラット化されていないたびに、この関数を呼び出す代わりに、なぜですか?
論理的な理由が見つかりません。(multidim-arrays のパフォーマンスは良くありません)
「JIT最適化の抑制...」のチェックを外さなかったため、関数呼び出しGetValueはインライン化されませんでした。
最適化されたコード:
b = a[3, 5];
00000026 mov eax,3
0000002b lea edx,[eax+2]
0000002e sub eax,dword ptr [ecx+10h]
00000031 cmp eax,dword ptr [ecx+8]
00000034 jae 0000010B
0000003a sub edx,dword ptr [ecx+14h]
0000003d cmp edx,dword ptr [ecx+0Ch]
00000040 jae 0000010B
00000046 imul eax,dword ptr [ecx+0Ch]
0000004a add eax,edx
0000004c mov edi,dword ptr [ecx+eax*4+18h]
試してみましたが、境界チェックと次元サイズによる乗算により、要素アクセスごとに約14命令です。
パフォーマンスが重要な場合は、ポインターへの固定の 1D 配列を使用します。