Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Feb 2009 18:01:53 -0500
From:      Junsuk Shin <junsukshin@gmail.com>
To:        Pieter de Goeje <pieter@degoeje.nl>, freebsd-questions@freebsd.org
Subject:   Re: read() vs fread()
Message-ID:  <7873ac110902201501l74a79ffyfca138331386c317@mail.gmail.com>
In-Reply-To: <200902202209.12765.pieter@degoeje.nl>
References:  <7873ac110902201207t61038469o6a94d81bcd392941@mail.gmail.com> <200902202209.12765.pieter@degoeje.nl>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?7873ac110902201501l74a79ffyfca138331386c317>