2

我的问题就在这里。
我有四个 3 维表,它们是一种查找表( 32x32x32 ),我必须在 C++ 中实时快速地检索值。
我的主要目标是计算时间,因为必须进行大量操作,而良好的编程实践是次要的,因为我不太担心代码维护。在大多数个人计算机上实现这一目标的最佳解决方案是什么?
我曾想过将数据存储在全局变量中并将它们放在一个单独的文件中,并通过诸如“extern const float first[32][32][32];”之类的声明来使用它们。或从文件加载矢量。
但我想后者会慢一些,因为数据必须通过另外一个指针来访问。
还有其他解决方案吗?

我在网上进行了搜索,但是当我阅读不同的事实时,这让我更加困惑。
例如,这两个网站似乎没有提出相同的建议(如果我理解正确的话):site1site2

4

2 回答 2

2

如果您对每个元素执行操作,则很有可能可以并行执行。由于您对优化访问时间特别感兴趣,因此可以考虑将数组视为一维数组以加快访问速度。

   struct Object32P3 {
     union { 
    struct {float arr3[32][32][32]}; 
    struct {float arr1[32768]}; 
    }; 
    }; 

通过偏移量访问 1D 数组比紧密循环中的 3d 数组更快。

我之所以说访问不应该是您必须尝试和优化的第一个地方,是因为您在访问元素后正在执行一些操作,这是查看和优化的最佳位置。

于 2012-09-19T08:15:35.033 回答
2

访问多维数组中的数据

float data[32][32][32];
data[i][j][k];

完全等同于访问展平数组

float data[32768];
data[i * 1024 + j * 32 + k];

没有涉及额外的指针,只是数组索引的算术。

在性能方面,anextern const float [32][32][32]将为编译器提供优化整个程序的机会,因为它可以完全访问数据以及您如何使用它。

将文件中的数据加载到动态大小的文件vector<vector<vector<float>>>中会导致多个指针间接访问数据元素;鉴于您知道数据的大小,将其加载到 astatic 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;
于 2012-09-19T08:54:13.193 回答