Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Stud_1_1 / LecRus / MainPart.doc
Скачиваний:
116
Добавлен:
03.03.2016
Размер:
5.03 Mб
Скачать

Автоматическая оптимизация программ

В Турбо Паскале выполняется несколько типов оптимизации кода компилируемой программы с целью повышения ее быстродействия и уменьшения объема занимаемой памяти.

1. Свертывание констант.

Если операндами выражения являются константы ординального типа, то выражение вычисляется в период компиляции. То же относится к функциям abs, sqr, succ, pred, odd, lo, hi, swap, если их аргументами являются константы ординального типа.

Пример 1.

Var k : integer;

Begin

k:=abs(-15)+sqr(7)-6*12;

Для выполняемой программы записанный в исходном тексте оператор будет заменен оператором k := -23;

Если индексом массива является константа или выражение, состоящее из констант, то адрес элемента массива вычисляется во время компиляции. Например, доступ к элементам a[sqr(7)+2,3*8] и a[61,24] будет таким же эффективным, как и доступ к простой переменной.

2. Слияние констант.

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

Пример 2.

Writeln('Введите значение ','x =');

................................

Writeln('Введите значение ','y =');

................................

Writeln('Введите значение ','z =');

................................

Для объектного кода программы это эквивалентно фрагменту

Const S = 'Введите значение ';

Begin

Writeln(S,'x =');

................

Writeln(S,'y =');

................

Writeln(S,'z =');

................

3. Вычисление по короткой схеме.

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

Пример 3.

If (x>0) and (x<100) and (y>1) and (y<x) then ...

While (x<0) or (y>1) or (z>x+y) do ...

Если x = -1, то вычисление обоих логических выражений прекращается после вычисления значения истинности первого операнда. В первом случае имеем для всего выражения значение false, во втором - значение true.

4. Удаление неиспользуемого кода.

Операторы, которые никогда не будут выполняться, в объектный код программы не включаются.

Пусть в исходном тексте программы записан оператор

If false then

y:=sqr(x)+1;

Такой оператор при компиляции программы игнорируется.

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

Пример 4.

Const KeyPrint = 0; { Ключ тестовой печати: }

{ 0 - тестовая печать отсутствует ; }

Begin { 1 - активизируется тестовая печать }

...............................

If KeyPrint>0 then

Begin

Печать массива A

End;

................................

Операторы отладочной печати включаются в объектный код программы, если до ее компиляции было установлено значение константы KeyPrint = 1.

5. Эффективная компоновка.

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

Данный тип оптимизации кода имеет особое значение при использовании модулей. Если в программе записана фраза

Uses Graph;

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

Здесь следует отметить, что при компиляции программы в память эффективная компоновка не работает. Этим объясняется, почему некоторые программы становятся меньше при компиляции их на диск.

Соседние файлы в папке LecRus