На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила ЧаВо (FAQ) разделов Паскаля
В этом разделе разрешено создавать только темы, в которых описано РЕШЕНИЕ какой-либо общей проблемы, или описание какого-либо аспекта языка Паскаль.
Обсуждение уже созданных тем разрешено, но только конструктивное, например указание на ошибку или уточнение имеющегося текста.

Также читать Требования к оформлению статей
Модераторы: volvo877, Romtek
  
> АВТОМАТИЧЕСКАЯ ОПТИМИЗАЦИЯ ПРОГРАММ, Что делает компилятор с вашим кодом...
    Автоматическая оптимизация программ


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

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

    Пример 1.
    ExpandedWrap disabled
      Var  k : integer;
      Begin
        k:=abs(-15)+sqr(7)-6*12;

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

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

    Пример 2.
    ExpandedWrap disabled
        Writeln('Введите значение ','x =');
        ................................
        Writeln('Введите значение ','y =');
        ................................
        Writeln('Введите значение ','z =')
        ................................

    Для объектного кода программы это эквивалентно фрагменту
    ExpandedWrap disabled
        Const  S = 'Введите значение ';
        Begin
          Writeln(S,'x =');
          ................
          Writeln(S,'y =');
          ................
          Writeln(S,'z =');
          ................


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

    Пример 3.
    ExpandedWrap disabled
      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. Удаление неиспользуемого кода. Операторы, которые никогда не будут выполняться, в объектный код программы не включаются.
    Пусть в исходном тексте программы записан оператор
    ExpandedWrap disabled
      If false then y:=sqr(x)+1;

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

    Пример 4.
    ExpandedWrap disabled
      Const  KeyPrint = 0;  {   Ключ тестовой печати: }
                            { 0 - тестовая печать отсутствует ; }
      Begin                 { 1 - активизируется тестовая печать }
      ...............................
      If KeyPrint>0 then
        Begin
          Печать массива A
        End;
      ................................

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

    5. Эффективная компоновка. Процедуры и функции, к которым в программе нет ни одного обращения, в объектный код не включаются. Не включаются в объектный код также переменные, которые описаны в разделах Var, но в программе не используются.
    Данный тип оптимизации кода имеет особое значение при использовании модулей. Если в программе записана фраза
    ExpandedWrap disabled
      Uses Graph;

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

    По мотивам лекций Назаренко В.И.
    user posted image
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0849 ]   [ 17 queries used ]   [ Generated: 14.10.19, 01:46 GMT ]