Оптимизацией называется такое преобразование исходного текста программы, при котором результат ее выполнения остается неизменным, но улучшаются некоторые ее характеристики. Основные критерии оптимизации: 1. Время выполнения; 2. Затраты RAM; 3. Размер исходного кода. При оптимизации необходимо выделить фрагменты программ, которые являются основными потребителями ресурсов, а затем перепрограммировать эти фрагменты, решая задачу оптимизации. Оптимизация, зависящая от компилятора. Современные компиляторы, создающие на основе исходного текста исполнимый код, как правило выполняют его оптимизацию, размещая инструкции процессора таким образом, чтобы сохранить время выполнения программы Инициализация объектов данных. Во многих программах некоторые части данных необходимо инициализировать, т.е. присвоить им начальное значение. Такое присваивание происходит либо в начале программы, либо в начале цикла. Сэкономить на инициализации некоторых типов данных можно и использованием типизированных констант. Программе необходимо инициализировать массив: 1. в программе в исполнительной части: for I := 1 to n do readln(A[i]); 2. на этапе компиляции: в разделе описания констант описываем типизированную константу: const A: array[1..5] of byte = (5, 10, 15, 20, 25); Программирование арифметических операций В случае, когда значительные части работы программы отводится арифметическим вычислениям, то необходимо программировать операции. Разные арифметические операции значительно отличаются по скорости. Много времени занимает на обращение к подпрограммам. Быстродействие зависит от типов операндов. Операции по возрастанию времени: сложение, вычитание, умножение, деление. Т.е. если в программе надо разделить на два, то заменяем на умножение на 0.5. Пример: – 4 быстрых опреации и 10 медленных. Всего 14. Преобразовываем до: x(x(x(ax + b) + c) + d) + e – здесь уже 4 медленных операции и 4 быстрых. Вот такими нехитрыми способами можно повышать производительность вычислений в программе. Оптимизация циклов Цикл с предусловием while выполняется на 20 – 30% дольше чем цикл for или repeat. На скорость выполнения программы влияет порядок вложенности цикла. Пример: For i := 1 to 100000 do For j := 1 to 1000 do a := 1;
For i := 1 to 1000 do For j := 1 to 100000 do a := 1;
Оператор присваивания выполняется одинаковое количество раз, но затраты времени выполнения различны, потому что инициализация цикла, т.е. обработка процессором его заголовка для определения начального и конечного значения параметра и шага приращения требуют времени. Цикл с наименьшим количеством повторений должен быть внешним.
Вот немного из теории оптимизации программ. Взял за основу лекции по программированию. Добавил пару примеров сам. Еще будет продолжение.
Pavel, молодец! Сейчас такая пора, что на большинстве форумов даже вразумительного ответа не получить(весенний гон называется), а он даже небольшую статейку написал. Ну а теперь по сабжу.. Многое очень спорно..
Quote
Современные компиляторы, создающие на основе исходного текста исполняемый код, как правило выполняют его оптимизацию, размещая инструкции процессора таким образом, чтобы сохранить время выполнения программы
Возможно имеется ввиду "сократить", а не "сохранить". В любом случае это не совсем верно. Компилятор вполне может решить, что в данной ситуации важнее не скорость, а размер.
Quote
Т.е. если в программе надо разделить на два, то заменяем на умножение на 0.5.
Справедливо только если результат будет вещественный, иначе юзаем сдвиг.
Quote
Цикл с предусловием while выполняется на 20 – 30% дольше чем цикл for или repeat
обосновать можете? Просто я не вижу причин, по которым один цикл должен уступать другому, хотя особо над этим не задумывался.
Code
обработка процессором его заголовка для определения начального и конечного значения параметра и шага приращения требуют времени.
Шаг в паскале задавать нельзя, тут всё строго. В обоих примерах будет сгенерированно два цикла. По поводу циклов стоит обязательно отметить вот какой момент:
Code
for i:=1 to 3 do A[i]:=0;
А ведь так намного быстрее:
Code
A[1]:=0; A[2]:=0; A[3]:=0;
А про арифметику самое главное забыли, а именно рассказать о том, как избавиться от кощунственного деления и умножения, если делим на степень двойки с целыми числами.
Quote
Взял за основу лекции по программированию.
А вот это зря. На лекциях часто говорят в духе: "один фиг придурки учатся, пусть хоть по аналогии делают". Но это моё личное и крайне субъективное мнение. Скажем дружно- нафиг нужно!
Мда. Вот насчет этой статейки: скажем так, оптимизации здесь кокртно оговорено не было, а лишь указаны направления. В плане того, что надо искать слабые места в программах. Абсолютно согласен, что функции типа: inc, dec, shl, shr выполняются намного быстрее самописных аналогов (не обязательно функций). Вот по правде сказать, не пробовал я на 286 эти проги. Еще хочется добавить, что чем меньше лишнего в программе, тем она лучше. Это мое мнение. Ну и еще стараюсь делать их понятными (для себя в будущем). По поводу шага: ничего не мешает его изменить в цикле. Вообщем да, эта статья может быть и ошибочна, но вот поверишь, или нет Alexander, я не мог все свои мысли оформить так сказать сразу и вместе. Еще следует сказать про инварианты с массивами. Так же я слыхал о том, что где можно, заменять двумерные массивы на одномерные. (обращение к элементам легко пересчитать). Изначально хотелось написать о том, как не надо писать программы. Не получилось. А то вот даже на форуме порой видать нечто страшное. Вот я все-таки проверю на деле эти положения, которые я описал, потому что слышал я их от очень опытного "волка" в прораммировании.
Я поясню чего бы мне здесь хотелось: автор выкладывает статью(или её начало), затем ниже идёт обсуждение и если какие-то моменты будут признаны всеми сторонами(или подавляющим большинством) не верными, то их из статьи убираем. Добавления в статью производится редактированием первого поста.
Quote
я не мог все свои мысли оформить так сказать сразу и вместе.
Ну на планете таких людей не много, а те кто умеют скорее гуманитарии . Тут есть ещё один важный момент- для какой цели делается программа. Если это лаба по программированию, то главное понятный преподу код написать. Ну очень они не любят, когда студент успешно доказывает, что то, как они делали в этой задаче годами просто глупо . И вообще наибольшие тормоза в паскале из-за эмулятора NTVDM. Рекомендую ставить ему приоритет "ниже среднего". Скажем дружно- нафиг нужно!
И вообще наибольшие тормоза в паскале из-за эмулятора NTVDM. Рекомендую ставить ему приоритет "ниже среднего".
Так и делаю. Когда так делаю, то Winamp перестает заикаться.
Quote (Alexander)
Я поясню чего бы мне здесь хотелось: автор выкладывает статью(или её начало), затем ниже идёт обсуждение и если какие-то моменты будут признаны всеми сторонами(или подавляющим большинством) не верными, то их из статьи убираем.
Ты прав, всякой ерунды хватает. А вот я еще так думаю: несомненно, книг выложено целые кучи в сети, и именно поэтому постарался написать статью от себя. Может быть не получилось. Но хотелось вкратце и по сути. Вообщем, начало положено. Согласен, что нужно выкладывать проверенные данные. Лично проверенные. Так что буду стараться писать лучше.