我的问题在这里
我有四个三维表,它们是一种查找表(32x32x32),我必须在c ++中实时和非常快速地检索值。
我的主要目标是计算时间,因为必须进行大量的操作,而良好的编程习惯是次要的,因为我不太担心代码维护。
为实现这一目标,大多数个人计算机的最佳解决方案是什么?
我曾想过将数据存储在全局变量中,并将它们放在一个单独的文件中,并通过“extern const float first [32] [32] [32];”或从文件加载向量等声明来使用它们。 />
但我想,后者会慢一些,因为数据必须通过一个指针来访问
还有其他解决办法吗?
我在网上搜索过,但是当我读到不同的真相时,这让我更加困惑 例如,这两个网站似乎没有提出相同的建议(如果我理解正确的话):site1,site2
答案 0 :(得分:2)
如果您正在对每个元素执行操作,则很可能并行执行此操作。由于您特别感兴趣的是优化访问时间,因此可以考虑将阵列视为一维阵列以便更快地访问。
struct Object32P3 {
union {
struct {float arr3[32][32][32]};
struct {float arr1[32768]};
};
};
通过偏移访问1D数组比紧密循环中的3d数组快。
我说访问不应该是您必须尝试和优化的第一个原因是因为,您在访问元素后执行某些操作,这是查看和优化的最佳位置。
答案 1 :(得分:2)
以多维数组访问数据
float data[32][32][32];
data[i][j][k];
完全等同于访问平顶数组
float data[32768];
data[i * 1024 + j * 32 + k];
不涉及额外的指针,只是对数组索引进行算术。
在性能方面,extern const float [32][32][32]
将为整个程序优化提供编译器机会,因为它可以完全访问数据以及如何使用它。
将文件中的数据加载到动态大小的vector<vector<vector<float>>>
中会导致多个指针间接访问数据元素;如果您知道数据的大小,将其加载到static float[32][32][32]
会更有效。
对于在编译时未知范围的数据,一个好的选择是使用Boost.MultiArray:
typedef boost::multi_array<float, 3> array_type;
array_type A(boost::extents[32][32][32]);
A[i][j][k] = 5.0f;