Re: fprintf && write

From
Valentin Nechayev ()
To
Serge Ryabchun ()
Date
2003-06-06T11:47Z
Area
RU.UNIX.PROG
From: Valentin Nechayev <netch@segfault.kiev.ua>

>>> Serge Ryabchun wrote: 

SR> char str[ 1024]; 
SR> memset( str, ' ', 1024); str[ 1022] = '\n'; str[ 1023] = 0;

SR> for( i = 0; i < 324000 * 100; i++) write( 1, str, 1024);

SR> [sr@serge write]$ time ./write 1> /dev/null
SR> 6.96user 7.74system 0:15.31elapsed 96%CPU (0avgtext+0avgdata 0maxresident)k
SR> 0inputs+0outputs (71major+10minor)pagefaults 0swaps

SR> for( i = 0; i < 324000 * 100; i++) puts( str);

SR> [sr@serge write]$ time ./puts 1> /dev/null
SR> 85.37user 2.84system 1:30.59elapsed 97%CPU (0avgtext+0avgdata 0maxresident)k
SR> 0inputs+0outputs (81major+12minor)pagefaults 0swaps

SR> В простейшем случае write куда лучше.

Это у тебя куски по 1024. Слишком много уходит на копирование в буфер.
На моём шелловом тазике (FreeBSD 4.8, K6-2-300) граница лежит в районе 160-200
байт - при записи кусками меньше этого размера выгоднее [f]puts() с его
передачей через stdio, больше - прямой write().
На другом - Linux (RedHat c 2.2.19-smp), PIII-800 - граница вообще в районе
30 байт :((
Ниччего не понимаю :((((

$ ./s
s: usage: prog method asize count
$ time ./s write 30 100000 >/dev/null
0.01user 0.05system 0:00.05elapsed 101%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (80major+10minor)pagefaults 0swaps
$ time ./s fputs 30 100000 >/dev/null
0.03user 0.02system 0:00.06elapsed 72%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (85major+11minor)pagefaults 0swaps

(это на том линуксе)

Что, в glibc такой дорогой stdio?

SR> BTW, сам syscall очень дешевый,
SR> примитивный getpid() перед write практически не изменил результат.

Ты уже в курсе, что getpid() крайне дёшев - он дальше общего шлюза не идёт
и никаких блокировок не применяет.


-netch-
--- ifmail v.2.15dev5
 * Origin: Dark side of coredump (2:5020/400)