Программирование (Козлова) - страница 39

Если в некоторых вычислениях применяется текущее значение переменной цикла, следует вывернуть ситуацию наизнанку, определяя нужные величины из начального и конечного значений переменной цикла, т. е. без перебора.

После оптимизации содержимого цикла, насколько это возможно, необходимо посмотреть, можно ли где-то убрать управляющие циклы операций перехода или вызова подпрограмм.

48. Управляющие таблицы

Очень часто целесообразно перенести вычисления из цикла за его пределы и отсрочить вычисления, пока их результаты реально не потребуются. Еще более эффективный вариант оптимизации заключается в том, чтобы приурочить вычисления не ко времени выполнения программы, а к моменту ее компиляции или ассемблирования либо выполнять вычисления, применяя специализированные программы, сохранять результаты в промежуточном файле и вытаскивать их оттуда при необходимости.

Особенно удобно применять оптимизацию просмотром управляющих таблиц.

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

Иногда управляющие таблицы вполне эффективно применяются в самых неожиданных ситуациях. Например, необходимо составить подпрограмму, которая будет рассчитывать число ненулевых разрядов в байте. Можно составить цикл со сдвигами и действительно сосчитать ненулевые разряды. Однако намного быстрее будет применить таблицу, позиции в которой будут соответствовать значениям байта – от 0 до 255, а значения в данных позициях – числу ненулевых разрядов для каждого из подобных значений байта.

При этом для повышения быстродействия можно оформить данную подпрограмму как макроопределение и встраивать в программу везде, где необходимо. Для байтовых таблиц можно также повысить производительность с помощью замещения команды MOV на специальные команды XLAT. При этом можно будет обрабатывать не только байтовые таблицы.