Вычислительные затраты на индексацию и подстановку

#c #matrix

#c #матрица #c

Вопрос:

Допустим, у меня есть следующий код для обратной замены.

 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 .

Но я не уверен, какой из них больше нравится исполнителю. Какая-нибудь помощь?

Комментарии:

1. Хороший оптимизатор, скорее всего, преобразует последнее в первое, выводя b[i] вычисления из внутреннего цикла. В любом случае, если вас волнует производительность, измерьте ее; если вы не измеряете, это означает, что вам действительно все равно.

2. @IgorTandetnik Да, но все же: для меня в OP есть смысл. Обычно слишком полагаться на оптимизатор — плохой стиль, даже если вы совершенно уверены, что оптимизация сработает.

3. Я бы не использовал индекс (b [i] ), скорее я бы использовал указатели и автоматическое увеличение ( *p )

Ответ №1:

Определение double temp = b[i]; побуждает компилятор вести подсчет temp в одном из регистров процессора.В вашем другом коде компилятор может оставить подсчет в основной памяти, поскольку регистры не подходят для хранения массивов.

Массив, вероятно, хранился бы в кэше, если бы он не был очень большим, поэтому он все равно был бы довольно быстрым; но регистры работают быстрее.

Комментарии:

1. Забавно, что вы задаете этот вопрос. Так получилось, что у меня есть собственный код обратной замены hotspot. Мне не приходило в голову переносить свой счет в регистр, пока вы не указали на это. Итак, кто из нас двоих на самом деле отвечает на вопрос другого? Я полагаю, что это стало результатом сотрудничества между нами двумя, не так ли? Теперь мы оба будем наслаждаться более быстрым кодом.