Large gap between fwrite and write, and fread and read

Heiko Wundram (Beenic) wundram at beenic.net
Tue Jul 17 00:18:05 UTC 2007


On Monday 16 July 2007 14:06:57 Garrett Cooper wrote:
>     I ran some tests and I noticed a large difference in the cumulative
> sums of fwrite(2) vs write(3) and fread(2) vs read(3) (3-fold
> differences on a real machine).

This difference is at least partially explained when looking 
at /usr/include/stdio.h, which defines the FILE structure: read/write on a 
file descriptor is (pretty much) a direct syscall with operating system 
specific semantics on a wide range of behavior, such as buffering, flushing 
and seeking in read/write-opened files, whereas fread/fwrite on FILE*'s is 
an "abstraction" of file access for which the stdio-API defines semantics, 
such as buffering, the time flushing takes place and seeking in 
read/write-opened files, across different flavors of POSIX-compatible libc's 
equally.

As the stdio-interface is a "wrapper" (with indirect calls calling the syscall 
read at some point in time, see the FILE-structure definition), you'll have 
to expect a difference in runtime, too.

(You mixed up f{read,write}(3) and {read,write}(2), just as a sidenote, which 
is also indicative of the difference: man3 is indicative of a libc 
implementation, whereas man2 generally contains syscall documentation)

-- 
Heiko Wundram
Product & Application Development
-------------------------------------
Office Germany - EXPO PARK HANNOVER
 
Beenic Networks GmbH
Mailänder Straße 2
30539 Hannover
 
Fon        +49 511 / 590 935 - 15
Fax        +49 511 / 590 935 - 29
Mail       wundram at beenic.net


Beenic Networks GmbH
-------------------------------------
Sitz der Gesellschaft: Hannover
Geschäftsführer: Jorge Delgado
Registernummer: HRB 61869
Registergericht: Amtsgericht Hannover


More information about the freebsd-hackers mailing list