On 8/20/2012 5:24 AM, John Baldwin wrote:
On Saturday, August 18, 2012 5:05:11 pm Poul-Henning Kamp wrote:
In message <5030033b.4060...@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.

Perfect. Data.

_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to