遍历后加快数组查找速度?

我有一个123MB的大型int数组,它基本上是这样使用的:

 private static int[] data = new int[32487834]; static int eval(int[] c) { int p = data[c[0]]; p = data[p + c[1]]; p = data[p + c[2]]; p = data[p + c[3]]; p = data[p + c[4]]; p = data[p + c[5]]; return data[p + c[6]]; } 

eval()用不同的c调用很多(~50B次),我想知道是否(以及如何)我可以加速它。

我已经使用了一个不安全的函数和一个使用所有CPU 的固定数组 。 它是RayW的TwoPlusTwo 7卡评估器的C#端口。 C ++版本的速度微不足道。

GPU可以用来加快速度吗?

  1. 将数组引用缓存到局部变量中。 由于多种原因,静态字段访问通常比本地访问慢(其中一个原因是字段可以更改,因此必须一直重新加载.JIT可以更自由地优化本地)。
  2. 不要使用数组作为方法的参数。 硬编码7整数索引。 这减少了数组分配,间接惩罚和边界检查。
  3. 使用不安全的代码索引到数组。 这将消除边界检查。 使用GCHandle来修复数组并将指针缓存在静态字段中(不要只使用固定块 – 我相信它具有与输入相关的一定(小)开销。不确定)。
  4. 作为修复arrays的替代方法,使用VirtualAlloc分配123MBarrays并使用大页面。 这减少了TLB的失误。

所有这些都是硬核低级优化。 它们仅适用于您需要最高性能的情况。

我认为在优化此function时,我们几乎处于极限。 如果您显示函数的调用者,我们可能只会做得更好,以便它们可以作为一个单元进行优化。