Re: fprintf && write
- From
- Alexander Krisak ()
- To
- Andrey Melnikov ()
- Date
- 2003-05-31T22:23:50Z
- Area
- RU.UNIX.PROG
From: "Alexander Krisak" <chris@imp.lg.ua>
Hello, Andrey Melnikov
> Что-то у меня лыжи не едут совсем.
> Беру софтину, которая всю свою разумную жизнь работала так:
>
> out = fdopen(out_fd, "w");
> ....
>
> fprintf(out, "%s", buffer);
> ....
>
> Выкидываю все эти fprintf() и заменяю на свою функцию:
>
> static char wr_buf[1024];
> write_out (int fd, char *fmt, ...){
> va_list ap;
> fd_set wfds;
> struct timeval tv;
> int wlen = 0, len, wr;
>
> va_start(ap,fmt);
> (void) vsnprintf(wr_buf,sizeof(wr_buf),fmt,ap);
> va_end(ap);
>
> FD_ZERO (&wfds);
> FD_SET (fd, &wfds);
> len = strlen(wr_buf);
>
> while (wlen != len){
>
> tv.tv_sec = timeout; /* timeout; */
> tv.tv_usec = 0;
>
> if (!select (fd + 1, NULL, &wfds, NULL, &tv)){
> return -1;
> }
> wr = write(fd,wr_buf,len);
>
> if (wr < 0){
> return -1;
> } else {
> wlen += wr;
> }
> }
>
> return 0;
> }
>
> И скорость падает в 2 (два) с лишним раза. Где я тут неправ ?
man fopen() и все прочее на предмет буферизации выводимых данных.
в частности man setbuf и setvbuf.
--
kris
--- ifmail v.2.15dev5
* Origin: Severodonetsk-InterNetNews site http://www.sed.lg.ua/ (2:5020/400)