bormant писал(а):Интересно, вот такой вариант сколько даст?
28 секунд.
Но это же неспортивно.
Добавлено спустя 4 минуты 27 секунд:
bormant писал(а):если избавиться от вызова copy():
27 секунд
Модератор: Модераторы
bormant писал(а):Интересно, вот такой вариант сколько даст?
bormant писал(а):если избавиться от вызова copy():
{$H+,R-,Q-}
uses Strings, SysUtils, DateUtils;
var
  fi, fo: text;
  bufi, bufo: array [0..1024 * 8 - 1] of char;
  s: array[0..1024 * 2 - 1] of char;
  ts, te: TDateTime;
procedure ParseLine(var f: text; s: pchar);
var
  p, q: pchar;
  i: integer;
begin
  p := s;
  for i := 1 downto 0 do begin
    while not (p^ in [#0, #9, #32]) do inc(p);
    if p^ = #0 then Exit;
    inc(p);
  end;
  q := StrEnd(p);
  while (q > p) and not (q^ in [#9, #32]) do dec(q);
  if q = p then Exit;
  q^ := #0;
  Writeln(f, p, #9, q - p - 1);
end;
begin
  if ParamCount <> 1 then begin
    writeln('Usage: parse2 filename');
    exit;
  end;
  ts := now;
  Assign(fi, ParamStr(1)); Assign(fo, Paramstr(1)+'.out');
  Reset(fi); Rewrite(fo);
  SetTextBuf(fi, bufi); SetTextBuf(fo, bufo);
  while not SeekEof(fi) do begin
    Readln(fi, s); ParseLine(fo, s);
  end;
  Close(fi); Close(fo);
  te := now;
  Writeln('Elapsed: ', SecondsBetween(te, ts), ' seconds');
end.
bormant писал(а):результаты вот этого варианта
{$H+,R-,Q-,I-}
{$mode objfpc}
uses Strings, SysUtils, DateUtils;
var
  fi, fo: text;
  bufi, bufo: array [0..1024*8-1] of char;
  s: array[0..1024*2-1] of char;
  ts, te:TDateTime;
  i: LongWord;
procedure ParseLine(var f: text; s: pchar);
var
  p, q: pchar;
  i: integer;
begin
  p := s;
  for i := 1 downto 0 do begin
    while not (p^ in [#0, #9, #32]) do inc(p);
    if p^ = #0 then exit;
    inc(p);
  end;
  q := StrEnd(p);
  while (q > p) and not (q^ in [#9, #32]) do dec(q);
  if q = p then exit;
  q^ := #0;
  Writeln(f, p, #9, q - p - 1);
end;
const
  sTestLine: string[255] = '1359651612'#9'6'#9'10.254.254.18'#9'65422'#9'46.46.14.228'#9'52427'#9'1'#9'52'#9'ppp31'#9'eth1'#9'F'#0;
begin
  if ParamCount <> 1 then begin
    writeln('Usage: parse2 filename');
    exit;
  end;
  ts := now;
  //Assign(fi, ParamStr(1)); 
  //Reset(fi); 
  //SetTextBuf(fi, bufi); 
  Assign(fo, Paramstr(1)+'.out');
  Rewrite(fo);
  SetTextBuf(fo, bufo);
  //while not seekeof(fi) do begin
  //  readln(fi, s); //
  for i:= $FFFFFF downto 0 do begin
    move(sTestLine[1], s, length(sTestLine));
    ParseLine(fo, s);
  end;
  //close(fi); 
  close(fo);
  te := now;
  writeln('Elapsed: ', SecondsBetween(te, ts), ' seconds');
end.
$ fpc -al -pg parse3
$ time parse3 parse.txt; du -h parse.txt.out; gprof --flat parse3
Elapsed: 31 seconds
real   0m32.541s
user   0m7.498s
sys   0m2.245s
929M   parse.txt.out
Flat profile:
Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 19.73      1.72     1.72                             SYSTEM_FPSYSCALL$INT64$INT64$INT64$INT64$$INT64
 16.51      3.16     1.44 16777216     0.00     0.00  P$PROGRAM_PARSELINE$TEXT$PCHAR
 14.45      4.42     1.26                             FPC_PCHAR_LENGTH
 12.61      5.52     1.10                             SYSUTILS_STREND$PCHAR$$PCHAR
 10.15      6.41     0.89                             SYSTEM_INT_STR$INT64$OPENSTRING
  8.95      7.19     0.78                             FPC_MOVE
  5.16      7.64     0.45                             SYSTEM_FPC_WRITEBUFFER$TEXT$formal$INT64
  3.33      7.93     0.29                             fpc_write_text_char
  2.41      8.14     0.21                             fpc_write_text_pchar_as_pointer
  1.38      8.26     0.12                             fpc_write_text_sint
  1.26      8.37     0.11                             fpc_writeln_end
  0.80      8.44     0.07                             fpc_write_text_shortstr
  0.63      8.49     0.06                             FPC_SHORTSTR_SINT
  0.46      8.53     0.04        1     0.04     1.48  PASCALMAIN
  0.46      8.57     0.04                             fpc_get_output
  0.34      8.60     0.03                             fpc_write_text_pchar_as_array_iso
  0.23      8.62     0.02                             SYSTEM_GET_CALLER_FRAME$POINTER$$POINTER
  0.23      8.64     0.02                             fpc_write_end
  0.23      8.66     0.02                             fpc_write_text_boolean_iso
  0.17      8.68     0.02                             SYSTEM_INT_STR$LONGWORD$OPENSTRING
  0.11      8.69     0.01                             SYSTEM_FILEWRITEFUNC$TEXTREC
  0.11      8.70     0.01                             SYSTEM_FPSYSCALL$INT64$INT64$$INT64
  0.11      8.71     0.01                             fpc_shortstr_to_chararray
  0.11      8.72     0.01                             frame_dummy
  0.06      8.72     0.01                             SYSTEM_SPACE$BYTE$$SHORTSTRING
program ddin;
{$mode objfpc}{$apptype console}
uses regexpr,msestream,msestrings,classes,strutils, mseformatstr;
var
  s1: msestring;
  sa1: msestringarty;
  fs: ttextstream;
  r0,r1,r2: double;
begin
if ParamCount <> 1 then halt;
fs:= ttextstream.create(ParamStr(1));
with fs do begin
  try
    while not eof do begin
     readln(s1);
     s1:= ReplaceRegExpr('(^\s*)(\S+)\s+(\S+)\s+(\S+)(.*)',s1,'$2,$3,$4',true);
     sa1:= splitstring(s1,',',true);
     if high(sa1) < 2 then continue;
     if trystrtorealtydot(sa1[0],r0) and trystrtorealtydot(sa1[1],r1) and trystrtorealtydot(sa1[2],r2) then begin
       system.writeln(r0,r1,r2);
     end;
    end;
  finally
    close;
    free;
  end;
end;
end.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 1