遍历多维数组
Loop through multi-dimensional arrays
我找到了这篇关于如何快速遍历多维数组的文章。
我正在使用Method 6: Nested loops with linear array and single incrementing index.
它说Method 8: Single loop with linear array and incrementing index
更快,但我也需要嵌套循环索引。当我尝试通过 if 子句计算嵌套循环索引时,我的代码变慢了(至少比嵌套循环方法更糟糕)。
你能推荐一些计算单个指数的东西吗?
int x1=0,x2=0;
for (int i1 = 1; i1 <= 10000; i1++){
for (int i = 0; i < 10000; i++){
x1++;
if(x1>=100){
x1=0;
x2++;
}
if (x1 > 10)
{
a[i] += a[i - 10*1];
}
if (x2 < 95)
{
a[i] += a[i + 5*100];
}
}
}
对于多维数组结构a[x1][x2]
。我要计算 a[x1][x2]=a[x1-10][x2]+a[x1][x2+5]
哪个a[x1][x2]
转换为a[x1+x2*100]
程序代码
method 8: 462 ns
method 6 297 ns
有没有办法在速度方面改进此代码?
您使用了错误的索引,它应该是a[ROWS][COLS]
的,索引i = row * COLS + col
。那么你不需要内部循环中的if
s,你可以这样写:
double *v = a + 1000; // destination
double *c = a; // source is 10 rows before, using another pointer
// to take advantage of proximity in cache
for( x1 = 10; x1 < 100; x1++ ) {
for( int x2 = 0; x2 < 95; x2++) {
*v += *c + *(v + 5);
++v;
++c;
}
v += 5; // skip the last 5 columns
c += 5;
}
这给了我一个~130的结果,使用您发布的链接中的在线编译器
查看您的代码,您可以通过自己进行计算来避免这两个循环,这肯定不如编译器可以执行的效率。我建议您保留两个循环,但拆分循环以避免其中出现的情况,以便编译器可以将其转换为 SIMD 代码。
for(int i=0; i<10; i++) {
for(int j=0; j<95; j++) {
a[i * 100 + j] = a[i *100 + j + 5]
}
}
for(int i=10; i<100; i++) {
for(int j=0; j<95; j++) {
a[i * 100 + j] = a[(i - 10) * 100 + j] + a[i *100 + j + 5]
}
}
for(int i=10; i<100; i++) {
for(int j=95; j<100; j++) {
a[i * 100 + j] = a[(i - 10) * 100 + j]
}
}
您的代码将更易于阅读。
我没有在这里测试它,但对于更大的矩阵,可以提高性能以缓存局部性。查看您的代码,您可以使用平铺来执行此操作。
相关文章:
- 遍历并行数组以确定C++中的最大数字
- 遍历二维数组的所有子数组
- 遍历向量与数组哪个更快?
- 是否可以遍历传递给函数的数组?
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 数组数据以错误的方式遍历 Python/Matlab
- 如何使用 PHPCPP 传递对象数组,遍历每个对象并返回关联数组
- 如何使用指针遍历结构数组中的数组
- 程序在遍历所有值之前离开循环. 数组的
- 按顺序遍历 AVL 树,将值保存在数组中
- 数组 - 循环遍历辅助阵列
- 在C++中循环遍历二维数组时改进 O(n)
- 如何修复我的代码并使其遍历 2D 数组中的所有行?(C++)
- 如何遍历充满结构的数组
- 数组 通过指针遍历
- 在常量数组上使用指针遍历
- 如何遍历可变参数模板以填充 POD 数组
- 有条件的大平面数组遍历和令人惊讶的短循环执行时间
- 数组遍历中的BST