Замена операций на более эффективные

Рассмотрим в качестве примера фрагмент программы на Фортране:

DO 10 I = 1, 20

10 TABLE (I) = 2 ** I

Цикл DO порождает таблицу, содержащую первые 20 степеней двойки.

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

Существует более эффективный способ этих вычислений. Величина 2**I для текущего прохода по циклу может быть получена путем умножения на 2 значения, полученного на предыдущем проходе.

Подобные модификации могут быть осуществлены при вычислении относительного адреса элемента массива TABLE (I).

Если каждый элемент массива занимает 2 байта, то смещение вычисляется по формуле 2*(I - 1).

Dычисление требуемого смещения может быть получено путем сложения предыдущего смещения с 2. Поскольку сложение выполняется быстрее умножения, подобное преобразование приведет к более эффективному объектному коду.

Свёртка операндов

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

Пример:

При компиляции предложений:

S:= ’TE’+’XT’;

X:= 3 + Length(S)*2;

будет скомпилирован код эквивалентный

S:= ’TEXT’;

X:= 11;

Если выражением индекса массива была константа, то адрес элемента вычисляется во время компиляции. Доступ к элементу массива A[5,5] будет таким же эффективным, как доступ к отдельной переменной.

Короткое вычисление выражений

При коротком вычислении логических выражений код генерируется таким образом, что операция логического сложения (OR) не вычисляется, если один из операндов имеет значение ИСТИНА.

Аналогично:

- операция логического умножения (AND) не вычисляется, если один из операндов имеет значение ЛОЖЬ.

- операция умножения (*) не вычисляется, если один из операндов имеет значение 1.

- операция сложения не вычисляется, если один из операндов имеет значение 0.

Сдвиг вместо умножения

Операция X*C может быть заменена на X shl Y, если С = 2Y.

Аналогично, если размер элементов массива равен степени 2, то для вычисления индекса массива используется инструкция SHL, а не MUL.

Другие методы машинно-независимой оптимизации кода включают в себя преобразование цикла в линейный участок (развертывание цикла), слияния тел различных циклов, исключение невыполняемого кода, оптимизация передачи параметров в процедуры и функции и т.д.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: