Учебник по оптимизации кода Delphi:
Оптимизация строк
В Delphi есть три типа строк: короткая строка (строка[n], n=1..255). Область хранения выделяется статически, а размер определяется во время компиляции. Она наследуется от bp for. Тип символьного массива dos (pchar) предназначен в основном для совместимости с различными API. Он появился в bp7 и теперь более широко используется в Delphi. Его область хранения может быть выделена статически с помощью символьного массива или выделена вручную с помощью getmem. длинные символы Строка (ansistring) уникальна для Delphi. Ее область хранения динамически выделяется во время выполнения, что является наиболее гибким и наиболее подверженным злоупотреблениям.
Строковый тип AnsiString по умолчанию в Delphi будет автоматически инициализирован пустым без повторной инициализации. Следующий код:
В Delphi есть три типа строк: короткая строка (строка[n], n=1..255). Область хранения выделяется статически, а размер определяется во время компиляции. Она наследуется от bp for. Тип символьного массива dos (pchar) предназначен в основном для совместимости с различными API. Он появился в bp7 и теперь более широко используется в Delphi. Его область хранения может быть выделена статически с помощью символьного массива или выделена вручную с помощью getmem. длинные символы Строка (ansistring) уникальна для Delphi. Ее область хранения динамически выделяется во время выполнения, что является наиболее гибким и наиболее подверженным злоупотреблениям.
вар: строка;
начинать
с:=;
…
конец;
s:=; не требуется. Но стоит отметить, что это не влияет на результат возвращаемого значения функции. Вообще говоря, передача аргументов var происходит быстрее, чем возврат строкового значения.
Использование SetLength для предварительного выделения длинной строки (AnsiString) для динамического выделения памяти является основным преимуществом AnsiString, но оно может легко привести к провалу. Типичный пример выглядит следующим образом:
с2:= ;
для i:=2 до length(s1) do s2:=s2+s1[i];
Не говоря уже о том, что его можно заменить на delete. Основная проблема в том, что область памяти s2 повторно выделяется в цикле приведенного примера, что занимает довольно много времени. Простой и эффективный способ заключается в следующем:
setlength(s2,length(s1)-1);
для i:=2 до length(s1) do s2[i-1]:=s1[i];
Таким образом, память s2 будет перераспределена только один раз.
Потокобезопасность строк и динамических массивов До Delphi 5 эти непотокобезопасные вызовы операций с динамическими массивами и длинными строками использовали подсчет ссылок для решения своих критических проблем. Однако, начиная с Delphi 5, они были изменены непосредственно на некоторые операции. Чтобы избежать этой проблемы, добавьте к критическим инструкциям префикс инструкции блокировки. К сожалению, эта модификация достаточно дорогая, поскольку инструкция блокировки в процессоре Pentium II достаточно трудоемка, а для выполнения этой операции требуется около 28 дополнительных командных циклов, поэтому общий КПД снижается как минимум вдвое. Есть только один способ решить эту проблему — изменить основной код delphi rtl. После резервного копирования исходного файла замените все блокировки в source/rtl/sys/system.pas на {lock}. Разумеется, необходимо заменить все слово. Это еще не полностью оптимизировано. Следующим шагом является удаление инструкции xchg, которая также включена в библиотеку времени выполнения delphi4. Поскольку эта инструкция имеет неявный префикс блокировки, необходимо использовать xchg edx в процессах _lstrasg и _strlasg в system.pas. быть удалено. Замените [eax] следующим кодом:
mov ecx, [eax]
mov[eax],edx
mov edx,ecx
ок, все готово, просто скомпилируйте его и перезапишите system.dcu. Таким образом, эффективность его выполнения будет в 6 раз выше, чем у delphi5, и в 2 раза выше, чем у delphi4.