Estaba tratando de acelerar cierta rutina en una aplicación, y mi perfilador, AQTime, identificó un método en particular como un cuello de botella. El método ha estado con nosotros durante años, y es parte de un -unit "misceláneos":Relleno rápido de una cadena en 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;
En la parte del programa que estoy optimizando al momento en que el método se llama ~ 35k veces, y ¡requirió un asombroso 56% del tiempo de ejecución!
Es fácil ver que es una manera horrible de la izquierda-pad una cadena, así que lo reemplazó con
function cwLeftPad(const aString:string; aCharCount:integer; aChar:char): string;
begin
Result := StringOfChar(aChar, aCharCount-length(aString))+aString;
end;
que dio un impulso significativo. El tiempo de ejecución total pasó de 10,2 segundos a 5,4 segundos. ¡Increíble! Pero, cwLeftPad todavía representa aproximadamente el 13% del tiempo total de ejecución. ¿Hay alguna manera fácil de optimizar este método aún más?
¿Tiene algún dato? ¿Cuánto tiempo pasas en cada una de las funciones RTL involucradas en tu función? Digamos, ¿qué porcentaje se gasta asignando memoria y qué se gasta copiando caracteres? –
¿Está trabajando en D2009 o posterior, es decir, está trabajando con string = ansistring o con cadenas unicode? – PhiS
¿Cuál es la entrada típica para esta función? Si tiene un conjunto limitado de entradas en el mundo real, entonces el algoritmo puede ajustarse de una manera que podría ser más lenta para el caso general, pero será más rápido para usted. Wodzu tiene un ejemplo extremo. – JosephStyons