Оптимизация языка Delphi
1) Возвращаемое значение типа записи или массива
Программисты C++ не будут этого делать, потому что возвращаемое значение будет помещено в стек, что приведет к экономии времени и пространства. В Delphi такой проблемы нет. Возвращаемое значение эквивалентно параметру Out, и вызывающая сторона передает указатель на единицу памяти. Поэтому вы можете использовать возвращаемые значения записи или массива, чтобы повысить читаемость и удобство написания выражений.
2) Публичное выражение
Delphi извлекает общие выражения только из строки оператора. Если общее выражение содержит вызов функции или доступ к свойству, оно не извлекается, т. е. оценивается дважды, поскольку извлечение может привести к изменению семантики.
3) константные параметры
Когда параметры функции не изменяются, если длина параметра превышает 4 байта или имеет тип интерфейса, строки или динамического массива, использование константных параметров позволяет компилятору передать его в адресном режиме без изменения эталонной технологии.
4) Жесткая экономия
Delphi будет выделять как можно меньше места при выделении единиц хранения. Если он достаточно мал и может поместиться в регистре, обычно используется прямая работа с регистром. Например, при назначении записей или данных длиной 4 байта компилятор автоматически будет использовать 32-битные регистры по DWord.
5) Оператор
Деление на 2 или 4 будет оптимизировано для сдвига вправо, а умножение на 2 или 4 будет оптимизировано для сдвига влево, поэтому нет необходимости специально использовать операции сдвига, и можно написать более читаемый код. Но умножение и деление на 8 и другие числа, кратные 2, не будут иметь такой оптимизации.
i := i + 1; и Inc(i); обычно создают один и тот же код.
6) Плавающая точка
Delphi не оптимизирует вычисления с плавающей запятой, даже добавление нулевых операций не будет оптимизировано, и будет добавлено множество инструкций FWAIT. Поэтому при написании ключевых операций с плавающей запятой вы должны самостоятельно оптимизировать выражения и самостоятельно извлекать общедоступные выражения. Используйте промежуточные переменные как можно реже, поскольку переменные с плавающей запятой не будут оптимизированы и будут записаны обратно в память, даже если они не будут использоваться позже. При необходимости используйте ассемблер или рассмотрите возможность использования C. Тем не менее, в целом, нет большой разницы в производительности между эквивалентными программами с плавающей запятой на Delphi и C.
7) с заявлением
with может генерировать неявные промежуточные переменные, чтобы избежать повторных вычислений.
8) Коллекция
i в [0..31] быстрее, чем (i >= 0) и (i <= 31)
9) Разрядность
Если сжатие не используется, используйте целое число и кардинальное число, поскольку SmallInt, ShortInt, Byte и т. д. также будут занимать 4 или 8 байтов, когда байт выровнен. При расчете он по-прежнему составляет 32 бита, и его сначала необходимо расширить до 32 бит.