Очень часто целесообразно перенести вычисления
из цикла за его пределы и отсрочить вычисления, пока
их результаты реально не потребуются. Еще более эффективный вариант оптимизации заключается в том,
чтобы приурочить вычисления не ко времени выполнения программы, а к моменту ее компиляции или
ассемблирования либо выполнять вычисления, применяя специализированные программы, сохранять результаты в промежуточном файле и вытаскивать их оттуда при необходимости.
Особенно удобно применять оптимизацию просмотром управляющих таблиц.
Покажем прикладную систему, в которой удобнее
всего применять управляющие таблицы. Это программа, в которой необходимо поворачивать и перемещать отрезки линий, чтобы создавать у пользователя иллюзию объемного изображения. Подобная
программа должна определять синусы и косинусы
углов. Для вычисления данных функций обычно используют числа с плавающей точкой и разложение
в ряды, расчет которых влечет за собой множественные умножения и деления, а эти операции по времени
счета «дорогостоящие». При этом получаемые величины обладают значительно большей точностью, чем
это реально необходимо для обычных графических
адаптеров персональных компьютеров: даже цифры
с плавающей точкой одинарной точности (32 разряда)
вычисляются до 8 десятичных знаков, из которых
необходимы только 4 или 5. В подобной задаче и можно пользоваться преимуществами таблицы, в которую можно занести синусы углов с шагом в 1 градус
и с точностью до 4 десятичных знаков.
Иногда управляющие таблицы вполне эффективно
применяются в самых неожиданных ситуациях. Например, необходимо составить подпрограмму, которая
будет рассчитывать число ненулевых разрядов в байте. Можно составить цикл со сдвигами и действитель-
но сосчитать ненулевые разряды. Однако намного быстрее будет применить таблицу, позиции в которой
будут соответствовать значениям байта — от 0 до 255,
а значения в данных позициях — числу ненулевых разрядов для каждого из подобных значений байта.
При этом для повышения быстродействия можно
оформить данную подпрограмму как макроопределение и встраивать в программу везде, где необходимо.
Для байтовых таблиц можно также повысить производительность с помощью замещения команды MOV на
специальные команды XLAT. При этом можно будет обрабатывать не только байтовые таблицы.