Stavo cercando di velocizzare una certa routine in un'applicazione, e il mio profiler, AQTime, ha identificato un metodo in particolare come collo di bottiglia. Il metodo è stato con noi per anni, e fa parte di un -Unità "Varie":Quick padding di una stringa in 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;
Nella parte del programma che sto ottimizzando in questo momento il metodo è stato chiamato ~ 35k volte, e ci è voluto un incredibile 56% del tempo di esecuzione!
E 'facile vedere che si tratta di un modo orribile a sinistra-pad una stringa, quindi ho sostituito con
function cwLeftPad(const aString:string; aCharCount:integer; aChar:char): string;
begin
Result := StringOfChar(aChar, aCharCount-length(aString))+aString;
end;
che ha dato un notevole impulso. Il tempo totale di esecuzione è passato da 10,2 secondi a 5,4 secondi. Eccezionale! Ma, cwLeftPad rappresenta ancora circa il 13% del tempo totale di esecuzione. C'è un modo semplice per ottimizzare ulteriormente questo metodo?
Hai qualche dato a Quanto tempo viene impiegato in ciascuna delle funzioni RTL coinvolte nella tua funzione? Dite, quale percentuale viene spesa allocando memoria e cosa viene speso per copiare i caratteri? –
Stai lavorando su D2009 o successivo, cioè lavori con string = ansistring o con stringhe Unicode? – PhiS
Qual è l'input tipico per questa funzione? Se disponi di un numero limitato di ingressi nel mondo reale, l'algoritmo può essere ottimizzato in un modo che potrebbe essere più lento per il caso generale, ma sarà più veloce per te. Wodzu ha un esempio estremo. – JosephStyons