[fpc-pascal] msedb and fcl-db benchmarks

Martin Schreiber fpmse at bluewin.ch
Tue Jul 17 09:40:33 CEST 2007


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;
"
msestrings.utf8tostring:
"
function utf8tostring(const value: utf8string): msestring; overload;
"
msestring = widestring.

> 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...

Martin



More information about the fpc-pascal mailing list