[fpc-devel] TBufferedFileStream

Michael Van Canneyt michael at freepascal.org
Sun Sep 4 07:15:38 CEST 2016



On Sat, 3 Sep 2016, José Mejuto wrote:

> El 03/09/2016 a las 22:15, Michael Van Canneyt escribió:
>
>>> Added to the bugtracker implementation of TBufferedFileStream, there
>>> is one compatibility issue note in the bug entry.
>>> 
>>> http://bugs.freepascal.org/view.php?id=30549
>> 
>> Nice. I have assigned this to myself.
>> 
>> Out of curiosity:
>> Why do you think this is needed ? Is the caching provided by most of the
>> operating systems not enough ?
>
> Hello,
>
> 1) Delphi compatibility (It is available in Delphi).
>
> 2) TFileStream basically is a frontend for FileRead and FileWrite (Talking 
> about Windows) and once you invoke one of those you enter in multithread 
> contention, thread swapping, and maybe kernel mode (I'm not sure) so if you 
> read or write small pieces of data from files the performance is very poor. 
> Typical example is TFileStream.GetByte which I'm using in a parser, because 
> the file could be very big, and I don't want to read everything in a 
> TMemoryStream, performance of cache/buffered and regular is dramatically 
> different:
>
> ----------------------------------------------
> CACHE 1000000 byte sequential reads in 46 ms.
> FILE 1000000 byte sequential reads in 2200 ms.
> ----------------------------------------------
>
> And this result is with the system cache hot (in fact the full file is in 
> system cache).
>
> In the other hand a cache system is powerful than a buffered system if you 
> are writing something like a filesystem over a TFileStream where you may need 
> to jump here and there to read data, file allocation tables, attributes, and 
> so on, in this case a cache with multiple pages instead just one improves the 
> result (avoid multiple reads in the same zones).

And why did you not use the bufstream unit of FPC ?

The TBufStream stream implemented there works with any other stream, not just files.

Michael.


More information about the fpc-devel mailing list