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
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to