Правила создания быстрого кода под Delphi

Как известно, компилятор Delphi принадлежит классу оптимизирующих. Однако качественно оптимизация всё же во многом зависит от действий программиста. Чтобы компилятор создал максимально быстрый код необходимо ему в этом «помогать». Для этого имеет смысл придерживаться свода практических правил, соблюдение которых в процессе написания программ способствует генерации компилятором Delphi действительно быстрого кода.

1.    Нужно воздерживаться от использования переменных для временного хранения постоянных величин. Лучше подставлять в код точные значения или представлять «магические» числа в качестве констант (const).
2.    Можно безболезненно обходится без неиспользуемых объявлений и присвоений, поскольку компилятор способен их вычищать.
3.    Нужно тщательно контролировать использование переменных во избежание лишних перекрёстных присвоений их значений. Подобного рода оптимизация Delphi не по силам.
4.    Следует использовать только сжатые математические выражения, поскольку компилятор не умеет их упрощать.
5.    Нельзя использовать конструкции вида - а:=100*sin(60*pi/180), поскольку Delphi не только ни вычислит данную константу при компиляции, несмотря на свой фундаментальный анализ кода, но и будет покорно вызывать sin и pi в процессе исполнения программы. Если допустить, что в приведенном примере угол выражен переменной, то хотя бы число пи необходимо заменить константой до нужного знака.
6.    Следует помнить, что Delphi замечательно справляется с математическими выражениями, которые полностью составлены из констант, он вычисляет их на этапе компиляции.
7.    Нужно крайне внимательно контролировать заданные условия и их границы. Компилятор не способен ни выявлять заведомо ложные условия, ни вычищать заведомо лишние.
8.    Чтобы скомпилированный код не стал притормаживать, надо обязательно проследить, что математическое выражение, которое повторяется согласно условию несколько раз, во всех встречающихся конструкциях выражено одинаково.
9.    Сообщение «Сочетание знаковых и беззнаковых типов – расширились оба операнда» информирует не только о возможной ошибке, но и о потере вследствие преобразования общей производительности. К примеру, выражение, где переменная х объявлена как ineteger при заданном условии if х>$аbсd6123 then х:= $аbсd6123, несмотря на его верность, вызовет упомянутое предупреждение. Дело в том, что полученный код станет исполнять преобразования величин вплоть до 64 бит с дальнейшим сравнением всех 64-битных операндов. Между тем изменение типа переменой х с ineteger на cardinal, позволит не только избавиться предупреждения, но оптимизировать код до трёх строк вместо восьми.
10.    Если округление до большего не имеет значение, то при делении на степень двух лучше вместо nodiv 2 использовать shr 1. Связано это с тем, что Delphi справляется с оптимизацией сложения, умножения и в некоторых случаях деления. Для Delphi это так же просто, как для вебмастера установить информер на свой сайт.
11.    При возможности в case of нужно использовать элементы, которые расположены в арифметической прогрессии.
12.    Инвариантный код следует выносить за тело цикла, избегая при этом наиболее частой ошибки – for i:=1 to length(str) do. В противном случае при каждой очередной итерации будет выплывать функция length, что негативно скажется на общей производительности. Кроме того, длину строки желательно сразу присвоить переменной. Необходимо также избегать включения в тело цикла таких выражений, который заведомо не зависят от изменений итерационной переменной.

2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература