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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3