我发现了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]
method 8: 462 ns
method 6 297 ns
有没有办法可以在速度方面改进这段代码?
答案 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的结果