#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. Мне не приходило в голову переносить свой счет в регистр, пока вы не указали на это. Итак, кто из нас двоих на самом деле отвечает на вопрос другого? Я полагаю, что это стало результатом сотрудничества между нами двумя, не так ли? Теперь мы оба будем наслаждаться более быстрым кодом.