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)