循环通过多维数组

时间:2016-01-28 19:43:59

标签: c++ arrays loops multidimensional-array

我发现了this有关如何快速遍历多维数组的文章。

我正在使用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]

Program code

 method 8: 462 ns
method 6 297 ns

有没有办法可以在速度方面改进这段代码?

2 个答案:

答案 0 :(得分:0)

查看代码,通过自己进行计算来避免这两个循环,这肯定比编译器的效率低。我建议你保留两个循环但是分割循环以避免它们中的条件,以便编译器可以将它转换为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]
    }
}

您的代码将更易于阅读。

我没有在这里测试它,但是对于更大的矩阵,可以改善性能以缓存局部性。查看代码,您可以使用平铺来完成它。

答案 1 :(得分:0)

您使用的索引错误,应为categories.forEach(function(c) { c.branches = branches.filter(function(b) { var tmp = b.category; delete b.category; return tmp === c.category; }); }) ,索引为a[ROWS][COLS]。 然后你不需要内循环中的i = row * COLS + col,你可以这样写:

if

这使用你发布的链接上的在线编译器给我〜130的结果