Я пытался ускорить определенную процедуру в приложении, а мой профилировщик AQTime идентифицировал один метод, в частности, как узкое место. Этот метод был с нами на протяжении многих лет, и является частью «MISC» -Unit:Быстрое заполнение строки в Delphi
function cwLeftPad(aString:string; aCharCount:integer; aChar:char): string;
var
i,vLength:integer;
begin
Result := aString;
vLength := Length(aString);
for I := (vLength + 1) to aCharCount do
Result := aChar + Result;
end;
В рамках программы, что я оптимизируя на данный момент метод был назван ~ 35K раз, и это потребовало ошеломляющих 56% времени выполнения!
Легко видеть, что это ужасный способ левой колодки строку, поэтому я заменил его
function cwLeftPad(const aString:string; aCharCount:integer; aChar:char): string;
begin
Result := StringOfChar(aChar, aCharCount-length(aString))+aString;
end;
что дало значительный импульс. Общее время работы от 10,2 с до 5,4 сек. Потрясающие! Но cwLeftPad по-прежнему составляет около 13% от общего времени работы. Есть ли простой способ оптимизировать этот метод?
Есть ли у вас данные a сколько времени потрачено на каждую из функций RTL, участвующих в вашей функции? Скажем, какой процент тратится на выделение памяти и на что тратится копирование персонажей? –
Вы работаете на D2009 или новее, то есть работаете ли со строкой = ansistring или с unicode-строками? – PhiS
Что такое типичный ввод для этой функции? Если у вас ограниченный набор реальных входов, то алгоритм может быть изменен таким образом, который может быть медленным для общего случая, но будет быстрее для вас. Водзу имеет крайний пример. – JosephStyons