On Saturday, August 18, 2012 5:05:11 pm Poul-Henning Kamp wrote: > In message <5030033B.4060705_at_feral.com>, Matthew Jacob writes: > >On 8/18/2012 1:32 PM, Poul-Henning Kamp wrote: > >> Shouldn't we at least increase it to pagesize ? > >> > >What data suggests to you it would be better at pagesize? > > The number of system calls to fwrite() a big file ? Have you looked at an actual ktrace? :) stdio doesn't use BUFSIZ for regular files: head/lib/libc/stdio/makebuf.c: /* * Internal routine to determine `proper' buffering for a file. */ int __swhatbuf(fp, bufsize, couldbetty) FILE *fp; size_t *bufsize; int *couldbetty; { struct stat st; if (fp->_file < 0 || _fstat(fp->_file, &st) < 0) { ... *bufsize = BUFSIZ; return (__SNPT); } ... if (st.st_blksize <= 0) { *bufsize = BUFSIZ; return (__SNPT); } *bufsize = st.st_blksize; ... } For a regular file stdio will use the filesystem's block size, not BUFSIZ. Test program: #include <stdio.h> #include <err.h> int main(int ac, char **av) { char junk; FILE *fp; int i; fp = fopen("/tmp/junk", "w"); if (fp == NULL) err(1, "fopen"); for (i = 0; i < 1024 * 1024; i++) if (fwrite(&junk, sizeof(junk), 1, fp) != 1) errx(1, "fwrite failed"); return (0); } ktrace excerpt: 42599 a.out CALL write(0x3,0x800a04000,0x4000) 42599 a.out RET write 16384/0x4000 42599 a.out CALL write(0x3,0x800a04000,0x4000) 42599 a.out RET write 16384/0x4000 42599 a.out CALL write(0x3,0x800a04000,0x4000) 42599 a.out RET write 16384/0x4000 42599 a.out CALL write(0x3,0x800a04000,0x4000) 42599 a.out RET write 16384/0x4000 42599 a.out CALL write(0x3,0x800a04000,0x4000) 42599 a.out RET write 16384/0x4000 42599 a.out CALL write(0x3,0x800a04000,0x4000) 42599 a.out RET write 16384/0x4000 This hint also works for pipes (they set st_blksize to PAGE_SIZE). Given that, I think BUFSIZ should just be left alone. -- John BaldwinReceived on Mon Aug 20 2012 - 10:31:40 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:29 UTC