![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.125.162] |
![]() |
|
Сообщ.
#1
,
|
|
|
Автоматическая оптимизация программ В Турбо Паскале выполняется несколько типов оптимизации кода компилируемой программы с целью повышения её быстродействия и уменьшения объёма занимаемой памяти. 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, к которым имеются обращения. Здесь следует отметить, что при компиляции программы в память эффективная компоновка не работает. Этим объясняется, почему некоторые программы становятся меньше при компиляции их на диск. По мотивам лекций Назаренко В.И. |