C++ 索引和替换的计算成本
假设我有以下反替代代码C++ 索引和替换的计算成本,c++,matrix,C++,Matrix,假设我有以下反替代代码 for (int i = n - 1; i >= 0; i--) { double temp = b[i]; if (i != n - 1) { for (int j = i + 1; j < n; j++) temp -= A[i][j] * b[j]; } b[i] = temp/A[i][i]; } for(int i=n-1;i>=0;i--){ 双温=b[i]; 如果(i!=
for (int i = n - 1; i >= 0; i--) {
double temp = b[i];
if (i != n - 1) {
for (int j = i + 1; j < n; j++)
temp -= A[i][j] * b[j];
}
b[i] = temp/A[i][i];
}
for(int i=n-1;i>=0;i--){
双温=b[i];
如果(i!=n-1){
对于(int j=i+1;j
但对于我这个编程新手来说,以下内容似乎更简单:
for (int i = n - 1; i >= 0; i--) {
if (i != n - 1) {
for (int j = i + 1; j < n; j++)
b[i] -= A[i][j] * b[j];
}
b[i] /= A[i][i];
}
for(int i=n-1;i>=0;i--){
如果(i!=n-1){
对于(int j=i+1;j
每次从j=i+1
迭代到j=n-1
时,都需要对b[i]
进行索引。但是这个b[i]
是一个固定的量,因为这个迭代不依赖于i
的值
但我不确定编者更喜欢哪一个。有什么帮助吗?定义
double temp=b[i]代码>鼓励编译器将计数temp
保存在CPU的一个寄存器中。对于其他代码,编译器可能会将计数留在主存中,而寄存器不适合存储数组
阵列可能会被保存在缓存中,除非它非常大,所以它仍然相当快;但是寄存器速度更快。一个好的优化器可能会通过将b[i]
计算从内部循环中提升出来,将后者转换为前者。不管怎样,如果你关心表现,就要衡量它;如果你不测量,这意味着你并不真正在乎。@IgorTandetnik是的,但仍然:对我来说,OP有道理。过分依赖优化器通常是一种糟糕的风格,即使你相当确信优化会起作用。我不会使用索引(b[I]),而是使用指针和自动增量(*p++)。有趣的是,你应该问这个问题。我碰巧有一些自己的热点反替代代码。在你指出之前,我没有想到要把我的计分结果记在登记簿上。那么,我们两个中的哪一个在回答另一个的问题呢?我想这已经成为我们两个之间的合作了,不是吗?现在我们两个都将享受更快的代码。