【发布时间】:2012-07-14 16:22:16
【问题描述】:
我已经看到 C#“优化”用于访问一维数组(不调用函数来访问元素),但对于多维数组函数 GetValue 每次调用。为什么不每次“正常”访问(指针移动+检查)没有实现或者至少这个函数没有被扁平化时调用这个函数?
我找不到合乎逻辑的原因。 (multidim-arrays 的性能不是很好)
【问题讨论】:
标签: c# .net performance multidimensional-array
我已经看到 C#“优化”用于访问一维数组(不调用函数来访问元素),但对于多维数组函数 GetValue 每次调用。为什么不每次“正常”访问(指针移动+检查)没有实现或者至少这个函数没有被扁平化时调用这个函数?
我找不到合乎逻辑的原因。 (multidim-arrays 的性能不是很好)
【问题讨论】:
标签: c# .net performance multidimensional-array
我试过了,每个元素访问大约有 14 条指令,这是由于边界检查和维度大小的乘法。
如果性能很重要,请使用固定指针的一维数组。
【讨论】:
我没有取消选中“抑制 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]
【讨论】: