[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