Marcel Müller
11/16/2008 4:18:00 PM
Frank Neuhaus wrote:
> I have a large file that I am opening with an std::ifstream. This file
> contains a number of objects. My classes know how to deserialize from
> a std::istream, so right now, I am just passing this std::ifstream to
> my class constructors and they read themselfes from the stream
[...]
> I would expect it to read a big chunk into
> memory, and then have my deserialization basically work right inside
> memory. Could this be? What else could be the cause of the slowdown?
> How could I make this faster?
Well, the iostream classes...
If you are talking about really much data, the big chunks must be in the
order of a few megabytes to get rid of the awful access times of common
direct accessible storage devices. Maybe your file system cache does the
job for you, maybe not. At least the standard buffers of the I/O
libraries are not that large.
Have you checked whether the deserialization basically eats CPU
resources or more I/O?
Furthermore, are you using portable I/O? This usually ends up with
working byte by byte and many shift operations.
Some operating systems have a way of specifying sequential access to a
stream. This can significantly improve the cache efficiency and the
throughput. Unfortunately neither C nor C++ has a standard way to set
such flags.
As a start you might tweak the buffers of the underlying filebuf.
(Method setbuf)
Marcel