Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #5  
Antiguo 16-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
crear un grafico en excel 2007 desde Delphi 2007 Jose Manuel Varios 1 27-12-2013 19:56:30
Tstrings en datasnap juank1971 Conexión con bases de datos 4 25-05-2011 21:31:40
¿Delphi 2007 for win32 o BSD 2007? AzidRain La Taberna 6 29-07-2008 20:32:16
TStrings dvlt Varios 7 15-04-2008 15:36:37
Lanzamiento Delphi 2007, PHP y JBuilder 2007 R2 Santiago - Chile Andreano Noticias 4 14-05-2007 09:25:23


La franja horaria es GMT +2. Ahora son las 02:09:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi