read() vs fread()

Junsuk Shin junsukshin at gmail.com
Fri Feb 20 15:01:54 PST 2009


setvbuf(file, buf, _IOFBF, bufsize) solved the problem perfectly.
Thanks a lot.

On Fri, Feb 20, 2009 at 4:09 PM, Pieter de Goeje <pieter at degoeje.nl> wrote:
>
> On Friday 20 February 2009 21:07:57 Junsuk Shin wrote:
> > Hi BSD guys,
> >
> > While I was doing simple file read test, I found that there is a huge
> > difference in file read performance between read() and fread(). I'm
> > wondering if I'm doing something wrong or if someone has experienced
> > similar things.
> >
> > Here is what I did,
> >
> > For the specific application, I need to bypass cache (I read only
> > once, and that's all)
> > The test file is 700Mbytes dummy file.
> > Test app just reads the whole file.
> >
> > Test is done on FreeBSD 7.1 amd 64, Celeron E1200, WD Caviar SE16 SATA 7200
> > RPM
> >
> > For test 1,
> >
> > fd = open(name, O_RDONLY | O_DIRECT);
> > while(...) {
> >   cnt = read(....);
> >   ....
> > }
> >
> > for test 2,
> >
> > fd = open(name, O_RDONLY | O_DIRECT);
> > file = fdopen(fd,"r");
> > while(...) {
> >   cnt = fread(....);
> >   ....
> > }
> >
> > test 1 takes about 11.64 seconds (63 MBytes/s), and test 2 takes about
> > 51.53 seconds (14 MBytes/s)
> >
> > If I use the pair of fopen() and fread(), it will have cache effect,
> > so the result doesn't say much of hdd performance.
> >
> > Personally, I don't think the overhead of fread() (wrapper in libc) is
> > that huge. What would be the reason for this?
>
> The reason is that by default a FILE has a really small internal buffer. Take
> a look at gstat(8) while running the test: you can clearly see an insane
> amount of I/O requests being done (almost 5000 reads per second on my HDD).
> To solve this call setvbuf(3):
>
> setvbuf(file, buf, _IOFBF, bufsize);
>
> A bufsize of 16k or bigger should help a lot. After this modification, I see
> about 900 reads per second (using bufsize = 64k) and the read speed is equal
> to the read(2) case.
>
> Regards,
>
> Pieter de Goeje

--
Junsuk


More information about the freebsd-questions mailing list