4

C# は 1D 配列にアクセスするために "最適化されている" (要素にアクセスする関数を呼び出さない) ことを見てきましたが、multidim-arrays 関数の GetValue は毎回呼び出されます。「通常の」アクセス (ポインターのシフト + チェック) が実装されていないか、少なくともこの関数がフラット化されていないたびに、この関数を呼び出す代わりに、なぜですか?

論理的な理由が見つかりません。(multidim-arrays のパフォーマンスは良くありません)

4

2 に答える 2

1

「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] 
于 2012-07-24T17:16:46.160 に答える
1

試してみましたが、境界チェックと次元サイズによる乗算により、要素アクセスごとに約14命令です。

パフォーマンスが重要な場合は、ポインターへの固定の 1D 配列を使用します。

于 2012-07-16T04:12:22.147 に答える