Re: fprintf && write
- From
- Serge Ryabchun ()
- To
- Andrey Melnikov ()
- Date
- 2003-06-03T15:11:22Z
- Area
- RU.UNIX.PROG
From: Serge Ryabchun <sr@energy.uch.net>
Andrey Melnikov <Andrey.Melnikov@p116.f1340.n5030.z2.fidonet.org> wrote:
> Hello All!
>
> Что-то у меня лыжи не едут совсем.
> Беру софтину, которая всю свою разумную жизнь работала так:
>
> 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 (два) с лишним раза. Где я тут неправ ?
Стоп, стоп, стоп. В select wfds модифицируется. IMHO, только первый
раз ты получаеш правильный результат, а дальше отвал только по таймауту.
Потому и падение скорости в 2 раза.
Попробуй FD_ZERO, FD_SET перенести в цикл.
--
Serge Ryabchun sr@energy.uch.net
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)