Ver Mensaje Individual
  #5  
Antiguo 16-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Muy buena la opción de Neftali (no me acordé de ella) a la que se le podría sumar ExtractStrings de la unit Classes.

Para salir de dudas sobre la eficiencia de usar una u otra alternativa, hice una prueba sobre un archivo de texto de 22350 líneas con este código:
Código Delphi [-]
...
uses StrUtils;

var
  frec, ini, fin: Int64;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('C:\PRUEBA.TXT');
  Caption:= Format('Nro lineas: %d', [Memo1.Lines.Count[);
  QueryPerformanceFrequency(frec);
end;

// Usando for para concatenar
function Concat1(Lineas: TStrings): string;
var
  i: Integer;
begin
  Result := '';
  Lineas.BeginUpdate;
  try
    for i := 0 to Lineas.Count - 1 do
      Result := Result + Trim(Lineas[i]) + ' ';
    SetLength(Result, Length(Result)-1);
  finally
    Lineas.EndUpdate;
  end;
end;

// Usando AnsiReplaceText para concatenar
function Concat2(Lineas: TStrings): string;
begin
  Result:= AnsiReplaceText(Lineas.Text, sLineBreak, ' ');
end;

procedure TForm1.btnForClick(Sender: TObject);
begin
  Memo2.Clear;
  QueryPerformanceCounter(ini);
  Memo2.Text:= Concat1(Memo1.Lines);
  QueryPerformanceCounter(fin);
  Label1.Caption:= FormatFloat('0, µs.', (fin - ini) * 1000000 div frec);
end;

procedure TForm1.btnExtClick(Sender: TObject);
begin
  Memo2.Clear;
  QueryPerformanceCounter(ini);
  Memo2.Text:= Concat2(Memo1.Lines);
  QueryPerformanceCounter(fin);
  Label2.Caption:= FormatFloat('0, µs.', (fin - ini) * 1000000 div frec);
end;
(Mientras escribía la prueba recordé agreguar EnableControls y DisiableControls para mejorar la performance.)

El resultado promedio de 3 mediciones:
  • Procedimiento Concat1: 1.411.396 ms
  • Procedimiento Concat2: 7.415.044 ms

La balanza se inclina a recorrer el TStrings con un for y creo que es debido a que AnsiReplaceText debe realizar comprobaciones adicionales para lograr su gran ductilidad de uso.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita