我应该使用查找列表而不是大量的乘法吗?

Rya*_*s91 1 c# comparison performance lookup-tables multiplication

在我的应用程序中,我有一个非常大的字节数组,它是一个扁平的3维数组,我们使用3个嵌套for循环(x,y,z)填充数组,然后我们通过使用一点点数学得到我们想要的值,最具体地说:

要获取数组中的索引:

return x + z*SizeX + y*SizeX*SizeZ;
Run Code Online (Sandbox Code Playgroud)

并给出索引返回x/y/z坐标:

int index = pos;
var y = (ushort) (pos/SizeX/SizeZ);
pos -= y*SizeX*SizeZ;
var z = (ushort) (pos/SizeX);
pos -= z*SizeX;
var x = (ushort) pos;

return new BlockPos(x, y, z, index, this);
Run Code Online (Sandbox Code Playgroud)

首先,我会想象第二个可以提高效率,我只是不知道该怎么做,任何帮助都会受到赞赏:P

我的主要问题是,对于我来说,为y和x值创建一个查找表(在加载类时填充)会更快吗?或者将乘法放在那里更快?

编辑 在某些情况下,这个数学被称为很多,所以如果它更快,即使是更长的启动,它也会使差异变得更好.

Dam*_*ver 5

大多数语言和体系结构中,乘法将成为一个(或几个)机器指令.虽然这些指令可能相对昂贵,但它们仍应比执行查找操作更便宜 - 并且查找操作可能非常需要乘法.

例如"找到数组的第4个元素"将是

<array base address> + (3 * <array element size>)
Run Code Online (Sandbox Code Playgroud)

鉴于您的伪代码,我建议的唯一优化是执行"常量"操作(例如SizeX*SizeZ)一次,并存储这些结果.