I've done some test
there are 5 version of revcom test
1. original
2. done bigger buffer
3  use tTextSrteam

4+ 5 in place of readln i've pass const string
6 only one set string variable
7 no move- I've rem MOVE procedure

I've repeat test in program, because time of test are vary (I don't know why)
on FPC I use -OG3ru -XX - Xs parameters

Source attached
My conclusion:
1. on Linux MOVE implementation is very slow (or I make mistake in tests)
2. on win read via text file is two times slower than via handle, on Linux is not so slowly (depends on pt. 1)
on win consume 50%, on Linux 80%



Results:
On Delphi+win+athlon2.8

 readln 144696
 readln +big buffer 146475
 ttextStream 52767                        <2 times faster
 no read file 31106
 no read file +big buffer 30935
 no read file 30994
 no set string  32243
 no move 18353               <2 times faster
 ttextStream 52306
 readln +big buffer 146588
 readln 144410


on FPC+win+athlon2.8 (the same machine)
 readln 88309
 readln +big buffer 88159
 ttextStream 45789        <2 times faster
 no read file 32341
 no read file +big buffer 24045
 no read file 23886
 no set string  25246
 no move 15031   <2 times faster
 ttextStream 45425
 readln +big buffer 88460
 readln 87379

on FPC +linux gentoo+athlon 2.6
 readln 76621
 readln +big buffer 79921
 ttextStream 73222        <no times faster
 no read file 65700
 no read file +big buffer 70429
 no read file 75157
 no set string  80239
 no move 27527    <3 times faster
 ttextStream 76936
 readln +big buffer 77679
 readln 78108


Darek

PS. Sorry for my English.
{ The Computer Language Shootout
   http://shootout.alioth.debian.org/

   Contributed by Marco van de Voort
}
unit revcom;
interface
uses textStream,cpu_timer;


  procedure revRun(amem : integer);
  procedure revrun2(amem : integer);
  procedure revrun3(amem : integer);

  procedure testrevrun;
implementation
//{$mode objfpc}
{$I-}
//uses system;
//Uses BaseUnix;

var lookupComplement : array[#0..#255] of char;
    pa,
    pb : text;

Const FASTAXLAT : array[0..11] of array[0..1] of char = (
                  ( 'A', 'T' ), ( 'C', 'G' ),
                  ( 'B', 'V' ), ( 'D', 'H' ),
                  ( 'K', 'M' ), ( 'R', 'Y' ),
                  ( 'a', 't' ), ( 'c', 'g' ),
                  ( 'b', 'v' ), ( 'd', 'h' ),
                  ( 'k', 'm' ), ( 'r', 'y' ));

      BufferIncrement = 1024;

procedure flushbuffer(buffer:pchar;inbuf:integer);

var p,p2 : pchar;
    c  : char;

begin

  if inbuf>0 then
   begin

     p:=buffer;
     p2:[EMAIL PROTECTED];
     while p<p2 do
      begin
       c:=lookupcomplement[p^];
       p^:=lookupcomplement[p2^];
       inc(p);
       p2^:=c;
       dec(p2);
     end;
    if p2=p then
      p^:=lookupcomplement[p^];

   p:=buffer;
   while (inbuf > 60) do
     begin
        c := p[60];
        p[60]:=#0;
        writeln(pb,p);
        p[60]:=c;
        inc(p,60);
        dec(inbuf,60);
     end;
     p[inbuf]:=#0;
     writeln(pb,p);
  end;

end;


(*
function FileOpenA(const FileName: ansistring): Integer;
 {$IFNDEF WIN32}
 begin
   result:=fileopen(filename,mode);
 {$ELSE}
begin
    Result := Integer(CreateFileA(PChar(FileName), GENERIC_READ,
      FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL+FILE_FLAG_SEQUENTIAL_SCAN, 0));
{$ENDIF}
end;

 *)


procedure revrun(amem :integer);
const    rBufSize    =1024;

var s  : shortstring;
    c  : char;
    buffersize,
    bufferptr,
    len         : integer;
    rBuf        : pchar;

    p  :pchar;
    sss : ansiString;

    io : integer;
   lll : integer;
   hhh : integer;

//   pa  : tream;
begin
//  hhh:=fileOpenA('revcomp-input.txt');
  assign(pa,'revcomp-input.txt');
  reset(pa);
  assign(pb,'revcomp-output.txt');
  rewrite(pb);
  for c:=#0    to #255    do
    lookupcomplement[c]:=c;
  for len:=0 to high(FASTAXLAT) do
    begin
      lookupcomplement[FASTAXLAT[len][0]]:=upcase(FASTAXLAT[len][1]);
      lookupcomplement[FASTAXLAT[len][1]]:=upcase(FASTAXLAT[len][0]);
    end;
  buffersize:=bufferincrement*amem;
  bufferptr :=0;
//  rBufSize:=1024;
  getmem(p,buffersize);
//  getMem(buf,rBufSize+1);
//  lll:=170;
//  while pa.readLN(s)>=0 do begin
//     dec(lll);
//     s:='GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA';
  while not eof(pa) do begin
    readln(pa,s);

//   while (input.inoutFunc(input))=0 do
   {
   while  readFile(hhh,buf^,rBufSIze,io,nil) and (io>0) do   begin
   }
{     pb:=input.bufferptr;
     pc:=pb+input.buffersize;
     while pb<pc do begin
       pa:=pb;
       while pb^>#19 do inc(pb);
       move (buf,s[1],pb-pa);


       s[0]:=char(pb-pa);
}

       len:=length(s);
       if (len>0) and (s[1]='>') then
          begin
            flushbuffer(p,bufferptr);
            writeln(pb,s);
            bufferptr:=0;
          end
       else
         begin
           if (bufferptr+len)>=buffersize then
             begin
                inc(buffersize,bufferincrement+2);
                reallocmem(p,buffersize);
             end;
           move (s[1],p[bufferptr],len);
           inc(bufferptr,len);
         end;
//     end;

   end;
   flushbuffer(p,bufferptr);
   close(pb);
   close(pa);
end;



procedure revrun2(amem : integer);
const    rBufSize    =1024;

var s  : shortstring;
    c  : char;
    buffersize,
    bufferptr,
    len         : integer;
    rBuf        : pchar;

    p  :pchar;
    sss : ansiString;

    io : integer;
   lll : integer;
   hhh : integer;

   pa  : tTextStream;
begin
//  hhh:=fileOpenA('revcomp-input.txt');
//  assign(pa,'revcomp-input.txt');
//  reset(pa);
  pa:=tTextStream.create('revcomp-input.txt',0);
  assign(pb,'revcomp-output1.txt');
  rewrite(pb);
  for c:=#0    to #255    do
    lookupcomplement[c]:=c;
  for len:=0 to high(FASTAXLAT) do
    begin
      lookupcomplement[FASTAXLAT[len][0]]:=upcase(FASTAXLAT[len][1]);
      lookupcomplement[FASTAXLAT[len][1]]:=upcase(FASTAXLAT[len][0]);
    end;
  buffersize:=bufferincrement*amem;
  bufferptr :=0;
//  rBufSize:=1024;
  getmem(p,buffersize);
//  getMem(buf,rBufSize+1);
//  lll:=170;
  while pa.readLN(s)>=0 do begin
//     dec(lll);
//     s:='GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA';
//  while not eof(pa) do begin
//    readln(pa,s);

//   while (input.inoutFunc(input))=0 do
   {
   while  readFile(hhh,buf^,rBufSIze,io,nil) and (io>0) do   begin
   }
{     pb:=input.bufferptr;
     pc:=pb+input.buffersize;
     while pb<pc do begin
       pa:=pb;
       while pb^>#19 do inc(pb);
       move (buf,s[1],pb-pa);


       s[0]:=char(pb-pa);
}

       len:=length(s);
       if (len>0) and (s[1]='>') then
          begin
            flushbuffer(p,bufferptr);
            writeln(pb,s);
            bufferptr:=0;
          end
       else
         begin
           if (bufferptr+len)>=buffersize then
             begin
                inc(buffersize,bufferincrement+2);
                reallocmem(p,buffersize);
             end;
           move (s[1],p[bufferptr],len);
           inc(bufferptr,len);
         end;
//     end;

   end;
   flushbuffer(p,bufferptr);
   close(pb);
   pa.free;
//   close(pa);
end;



procedure revrun3(amem : integer);
const    rBufSize    =1024;

var s  : shortstring;
    c  : char;
    buffersize,
    bufferptr,
    len         : integer;
    rBuf        : pchar;

    p  :pchar;
    sss : ansiString;

    io : integer;
   lll : integer;
   hhh : integer;

   pa  : tTextStream;
begin
//  hhh:=fileOpenA('revcomp-input.txt');
//  assign(pa,'revcomp-input.txt');
//  reset(pa);
  pa:=tTextStream.create('revcomp-input.txt',0);
  assign(pb,'revcomp-output3.txt');
  rewrite(pb);
  for c:=#0    to #255    do
    lookupcomplement[c]:=c;
  for len:=0 to high(FASTAXLAT) do
    begin
      lookupcomplement[FASTAXLAT[len][0]]:=upcase(FASTAXLAT[len][1]);
      lookupcomplement[FASTAXLAT[len][1]]:=upcase(FASTAXLAT[len][0]);
    end;
  buffersize:=bufferincrement*amem;
  bufferptr :=0;
//  rBufSize:=1024;
  getmem(p,buffersize);
//  getMem(buf,rBufSize+1);
  lll:=170;
//  while pa.readLN(s)>=0 do begin
   while lll>0 do begin
     dec(lll);
     if lll mod 40 =0 then s:='>cos tam                    '
     else   s:='GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA';

       len:=length(s);
       if (len>0) and (s[1]='>') then
          begin
            flushbuffer(p,bufferptr);
            writeln(pb,s);
            bufferptr:=0;
          end
       else
         begin
           if (bufferptr+len)>=buffersize then
             begin
                inc(buffersize,bufferincrement+2);
                reallocmem(p,buffersize);
             end;
           move (s[1],p[bufferptr],len);
           inc(bufferptr,len);
         end;
//     end;

   end;
   flushbuffer(p,bufferptr);
   close(pb);
   pa.free;
//   close(pa);
end;



procedure revrun4(amem : integer);
const    rBufSize    =1024;

var s  : shortstring;
    s2 : shortString;
    c  : char;
    buffersize,
    bufferptr,
    len         : integer;
    rBuf        : pchar;

    p  :pchar;
    sss : ansiString;

    io : integer;
   lll : integer;
   hhh : integer;

   pa  : tTextStream;
begin
//  hhh:=fileOpenA('revcomp-input.txt');
//  assign(pa,'revcomp-input.txt');
//  reset(pa);
  pa:=tTextStream.create('revcomp-input.txt',0);
  assign(pb,'revcomp-output3.txt');
  rewrite(pb);
  for c:=#0    to #255    do
    lookupcomplement[c]:=c;
  for len:=0 to high(FASTAXLAT) do
    begin
      lookupcomplement[FASTAXLAT[len][0]]:=upcase(FASTAXLAT[len][1]);
      lookupcomplement[FASTAXLAT[len][1]]:=upcase(FASTAXLAT[len][0]);
    end;
  buffersize:=bufferincrement*amem;
  bufferptr :=0;
//  rBufSize:=1024;
  getmem(p,buffersize);
//  getMem(buf,rBufSize+1);
  lll:=170;
//  while pa.readLN(s)>=0 do begin
   s:='GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA';
   s2:='>cos tam ddddddddd';

   while lll>0 do begin
     dec(lll);

       len:=length(s);
       if ((len mod 40)=0 ) and (s2[1]='>') then
          begin
            flushbuffer(p,bufferptr);
            writeln(pb,s);
            bufferptr:=0;
          end
       else
         begin
           if (bufferptr+len)>=buffersize then
             begin
                inc(buffersize,bufferincrement+2);
                reallocmem(p,buffersize);
             end;
           move (s[1],p[bufferptr],len);
           inc(bufferptr,len);
         end;
//     end;

   end;
   flushbuffer(p,bufferptr);
   close(pb);
   pa.free;
//   close(pa);
end;


procedure revrun5(amem : integer);
const    rBufSize    =1024;

var s  : shortstring;
    s2 : shortString;
    c  : char;
    buffersize,
    bufferptr,
    len         : integer;
    rBuf        : pchar;

    p  :pchar;
    sss : ansiString;

    io : integer;
   lll : integer;
   hhh : integer;

   pa  : tTextStream;
begin
//  hhh:=fileOpenA('revcomp-input.txt');
//  assign(pa,'revcomp-input.txt');
//  reset(pa);
  pa:=tTextStream.create('revcomp-input.txt',0);
  assign(pb,'revcomp-output3.txt');
  rewrite(pb);
  for c:=#0    to #255    do
    lookupcomplement[c]:=c;
  for len:=0 to high(FASTAXLAT) do
    begin
      lookupcomplement[FASTAXLAT[len][0]]:=upcase(FASTAXLAT[len][1]);
      lookupcomplement[FASTAXLAT[len][1]]:=upcase(FASTAXLAT[len][0]);
    end;
  buffersize:=bufferincrement*amem;
  bufferptr :=0;
//  rBufSize:=1024;
  getmem(p,buffersize);
//  getMem(buf,rBufSize+1);
  lll:=170;
//  while pa.readLN(s)>=0 do begin
   s:='GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA';
   s2:='>cos tam ddddddddd';

   while lll>0 do begin
     dec(lll);

       len:=length(s);
       if ((len mod 40)=0 ) and (s2[1]='>') then
          begin
            flushbuffer(p,bufferptr);
            writeln(pb,s);
            bufferptr:=0;
          end
       else
         begin
           if (bufferptr+len)>=buffersize then
             begin
                inc(buffersize,bufferincrement+2);
                reallocmem(p,buffersize);
             end;
//         move (s[1],p[bufferptr],len);
           inc(bufferptr,len);
         end;
//     end;

   end;
   flushbuffer(p,bufferptr);
   close(pb);
   pa.free;
//   close(pa);
end;




procedure testRevRun;
var
  i,nn : integer;
  pp   : text;
  aa   : int64;
begin
  assign(pp,'result.txt');
  rewrite(pp);
  nn:=100;
  fillchar(lookupComplement,sizeof(lookupComplement),1);
  aa:=clock;
  for i:= 1 to nn do   revRun(4);
  aa:=clock-aa;
  writeln(pp,'  readln ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun(44);
  aa:=clock-aa;
  writeln(pp,'  readln +big buffer ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun2(4);
  aa:=clock-aa;
  writeln(pp,'  ttextStream ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun3(4);
  aa:=clock-aa;
  writeln(pp,'  no read file ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun3(4);
  aa:=clock-aa;
  writeln(pp,'  no read file +big buffer ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun3(4);
  aa:=clock-aa;
  writeln(pp,'  no read file ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun4(4);
  aa:=clock-aa;
  writeln(pp,'  no set string  ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun5(4);
  aa:=clock-aa;
  writeln(pp,'  no move ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun2(4);
  aa:=clock-aa;
  writeln(pp,'  ttextStream ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun(44);
  aa:=clock-aa;
  writeln(pp,'  readln +big buffer ',aa);
  aa:=clock;
  for i:= 1 to nn do   revRun(4);
  aa:=clock-aa;
  writeln(pp,'  readln ',aa);


  close(pp);

end;

begin
// run;
end.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to