繁体   English   中英

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

[英]Should i use lookup-lists instead of a lot of multiplication?

在我的应用程序中,我有一个非常大的字节数组,它是一个展平的3维数组,我们使用3个嵌套的for循环(x,y,z)填充该数组,然后通过使用一些数学运算来获得所需的值,最具体地说:

要在数组中获取索引:

return x + z*SizeX + y*SizeX*SizeZ;

并返回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);

首先,我想第二个可以提高效率,我只是不知道该怎么做,任何帮助将不胜感激:P

我的主要问题是,为我创建y和x值的查找表(在加载类时填充)会更快吗?还是只在其中保留乘法会更快?

编辑在某些情况下,该数学运算称为LOT,因此,即使它运行得更快,即使启动时间更长,其差异也会更好。

大多数语言和体系结构中,乘法将成为一个(或几个)机器指令。 尽管这些指令可能相对昂贵,但与执行查找操作相比,它们应该仍然更便宜-无论如何,查找操作很可能需要乘法。

例如,“定位数组的第四个元素”将是

<array base address> + (3 * <array element size>)

我建议您使用伪代码进行的唯一优化是一次执行“恒定”操作(例如SizeX*SizeZ ),然后存储这些结果。

这些可能会加快您的速度;

  • 使SizeX,SizeY,SizeZ常量
  • 预计算SizeXZ = SizeX * SizeZ及其他(也作为常量);

预先计算的数组索引将不会给您带来太大的好处,因为预先计算的列表将非常大,并且由于做很少的简单数学运算而对其进行查询可能不会更快。

由于大多数访问都经过边界检查,因此C#中的数组操作相对较慢(与某些其他语言相比)。 有一些方法可以解决这个问题。

  • 在不安全的部分中放置紧密的arrayloop并使用指针,请参见C#或Google中的大型数组算术,以了解“矩阵乘法不安全C#”
  • Mono具有跳过边界检查的参数。 您的情况可能会更快

可能还需要另一种加速方式来安排您的数学循环,以便您的数学处理顺序访问大型数组。 这样,每次访问都受益于这样的事实,即数据通常已经由先前的计算提取到了CPU缓存中。 因此,以这样的方式构造x,y,z循环,使您获得index = 1,index = 2,index = 3等。而NOT index = 0,index = 256,index = 512等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM