2Olin: Так, теперь давай считать
фактический_урон(i,j) = число_юнитов*базовый_урон(i,j)*К_атаки(i)*К_защиты(j)
число_юнитов - число юнитов, наносящих урон, переменная, float
базовый_урон(i,j) - константа, float
К_атаки(i) - поправка на религию атакующего, float
К_защиты(j) - поправка на религию и арты защитника, float
Пусть у атакующего N юнитов, защитника - M
Для того, чтобы вычислить полный урон по юниту j, тебе понадобится N вычислений фактического урона и столько же сумм. Для всех юнитов защитника еще и проделать М раз. Сохранением результатов пренебрегаем
те, сложность = (сложность_факт_урон(i,j)*N+float_sum*(N-1))*M
Соотвественно, для расчета уронов по атакеру
сложность = (сложность_факт_урон(j,i)*M+float_sum*(M-1))*N
т.е, всего сложность = сложность_факт_урон(j,i)*M*N*2 + float_sum*(N-1)*M + float_sum*(M-1)*N =
= сложность_факт_урон(j,i)*M*N*2 + float_sum*M*N*2 - float_sum*M - float_sum*N
Сложность фактического урона:
+вычисление адреса константы базового урона ( = целочисленный инкремент при последовательном обходе)
+умножение float К_атаки
+умножение float К_защиты
+умножение float число_юнитов
Итого:
6*M*N умножений float
2*(M-1)*(N-1) сложений float
2*M*N инкрементов указателя на базовый урон
справочника под рукой нет, но на глаз
умножение = 200 тактов
сложение = 60 тактов
инкремент = 10 тактов (худший случай)
Итого обращение к массиву составляет примерно 20/(1200+120) = 0.015, те 1.5% от общих вычислений. И это на уровне, близком к ассемблеру! Чем выше уровень языка, тем слабее будет линейная зависимость вычислений...
А теперь поверь мне, ни один программист в здравом уме не будет ради 2% раздувать код в 66*66 раз.
И дело тут уже не в производительности (2% ничего не решают - общий запас должен быть около 50% от железа), а в
сопровождении этого монстра...
Цитата:
Ускорение получается за счет изъятия операция со счетчиками. Именно лишняя операция инкремента счетчика (взятьИзПамяти-увеличить-положитьВпамять) дает тормоз в цикле.
Счетчик там не нужен. Переменной цикла может выступать указатель на строку таблицы базового урона, условием окончания - границы таблицы. см STL