给定以下数据,组织元素数组以便实现最快随机访问的最佳方法是什么?
每个元素都有一些 int 数字、一个以 '\0' 结尾的 3 个字符的名称和一个浮点值.
我看到两种可能的方法来组织和访问此类数组:
First:
typedef struct { int num; char name[4]; float val; } t_Element;
t_Element array[900000000];
//random access:
num = array[i].num;
name = array[i].name;
val = array[i].val;
//sequential access:
some_cycle:
num = array[i].num
i++;
Second:
#define NUMS 0
#define NAMES 1
#define VALS 2
#define SIZE (VALS+1)
int array[SIZE][900000000];
//random access:
num = array[NUMS][i];
name = (char*) array[NAMES][i];
val = (float) array[VALS][i];
//sequential access:
p_array_nums = &array[NUMS][i];
some_cycle:
num = *p_array_nums;
p_array_nums++;
我的问题是,什么方法更快,为什么?我的第一个想法是第二种方法可以生成最快的代码并允许最快的块复制,但我怀疑与第一种方法相比它是否可以节省敏感数量的 CPU 指令?
这取决于常见的访问模式。如果您打算迭代数据,随时访问每个元素,那么struct
方法更好。如果您计划独立迭代每个组件,那么并行数组会更好。
这也不是一个微妙的区别。由于主内存通常比 L1 缓存慢两个数量级,因此使用适合使用模式的数据结构可能会使性能提高三倍。
不过,我必须说,您实现并行数组的方法还有很多不足之处。您应该简单地声明三个数组,而不是使用二维数组和转换来“聪明”:
int nums[900000000];
char names[900000000][4];
float vals[900000000];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)