首页 > 解决方案 > 索引和替换的计算成本

问题描述

假设我有以下代码用于backsubstitution

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--) {
    if (i != n - 1) {
        for (int j = i + 1; j < n; j++) 
            b[i] -= A[i][j] * b[j];
    }
    b[i] /= A[i][i];
}

b[i]这需要每次从 迭代j = i+1到的索引j = n - 1。但这b[i]是一个固定数量,因为此迭代不依赖于 的值i

但我不确定编译器更喜欢哪一个。有什么帮助吗?

标签: c++matrix

解决方案


该定义double temp = b[i];鼓励编译器将计数保存temp在 CPU 的一个寄存器中。使用您的其他代码,编译器可能会将计数留在主内存中,寄存器不适合存储数组。

该数组可能会保存在缓存中,除非它非常大,所以它仍然会相当快;但寄存器更快。


推荐阅读