我试图查看我是否可以提高C ++中以下循环的性能,该循环使用二维向量(_external和_Table),并且对先前的迭代具有循环依赖。此外,它在最内层的循环中具有一个经过计算的索引访问器,这将使_Table的访问在右侧不连续。
int N = 8000;
int M = 400
int P = 100;
for(int i = 1; i <= N; i++){
for(int j = 0; j < M; j++){
for(int k =0; k < P; k++){
int index = _external.at(j).at(k);
_Table.at(j).at(i) += _Table.at(index).at(i-1);
}
}
}
如何改善这样的循环性能?
答案 0 :(得分:1)
在我看来,这些语句的顺序如下:
datetime
执行对正确性至关重要。 (也就是说,如果i,j,k的迭代顺序发生变化,则结果将有所不同……而且不正确。)
因此,我认为您仅需进行微优化,例如将表达式$casts
和 int index = _external.at(j).at(k);
_Table.at(j).at(i) += _Table.at(index).at(i-1);
提升到最内层循环。
考虑一下:
_Table.at(j).at(i)
此循环将数字重复添加到_external.at(j)
中。由于(通过检查) for(int k =0; k < P; k++){
int index = _external.at(j).at(k);
_Table.at(j).at(i) += _Table.at(index).at(i-1);
}
必须从表的另一个单元格读取(由于_Table.at(j).at(i)
与_Table.at(index).at(i-1)
的原因),您可以执行以下操作:
i-1
这将减少对i
的调用次数,也可能会稍微提高缓存性能。