[fpc-pascal] msedb and fcl-db benchmarks

Joost van der Sluis joost at cnoc.nl
Tue Jul 17 13:06:42 CEST 2007


On Tue, 2007-07-17 at 09:40 +0200, Martin Schreiber wrote:
> On Monday 16 July 2007 14.20, Joost van der Sluis wrote:
> > Hi all,
> >
> > To see what the differences in speed are between MSEdb and fcl-db I did
> > some benchmarks. (See the attachment for the code and results)
> >
> [...]
> 
> > I tried to explain the readdata-difference. At first I thought that
> > msedb converted all strings from string to widestring to string. But it
> > doesn't do that. (see my mails on this subject)
> >
> You are wrong here.
> "
> function tmsebufdataset.loadbuffer(var buffer: recheaderty): tgetresult;
> [...]
>      if field1.datatype in charfields then begin
>       int2:= int2*4+4; //room for multibyte encodings
>       setlength(str1,int2); 
>       if not loadfield(field1,pointer(str1),int2) then begin
>        setfieldisnull(buffer.fielddata.nullmask,fno);
>       end
>       else begin
>        if int2 < 0 then begin //buffer to small
>         int2:= -int2;
>         setlength(str1,int2);
>         loadfield(field1,pointer(str1),int2);
>        end;
>        setlength(str1,int2);
>        po2:= pointer(@buffer) + offset;
>        if bs_utf8 in fbstate then begin
>         po2^:= utf8tostring(str1);     <<<<<<<<<<<<<<<<----
>        end
>        else begin
>         po2^:= msestring(str1);     <<<<<<<<<<<<<<<<----
>        end;

Ah, that could explain the long fetch-times. I'll investigate this.

> > I think that the only reasonable explanation is the argument from
> > Michael: using ansistrings/pointers to store the data instead of storing
> > them directly into a buffer, induces so much overhead that it becomes
> > too slow.
> >
> > Overall, I would conclude that the current design of the TBufDataset of
> > fcl-db is a better choice then the design of tmseBufDataset. Since fcl-
> > db is faster on those things a TBufDataset is build/meant for: browsing
> > through records.
> >
> tmsebufdataset is designed to work well with the MSEgui visual components 
> where TBufDataset was not ideally suited.
> 
> > Discussion: What tests could I do more? Is there something I overlooked?
> >
> To work with tmsqlquery you should use tmsestringfield.asmsestring and not 
> TField.AsString, otherwise the slow ansistring<->widestring conversion takes 
> place on every access. On Windows you should not use FPC 2.1.4+ because 
> widestrings are no more reference counted and heap based...

I'll change that. And I'm unsing linux.

Regards,
  Joost.




More information about the fpc-pascal mailing list