Re: Perl: эффективная буферизация
Timur V. Elzhov -> debian-russian@lists.debian.org @ Sun, 25 Sep 2005 20:28:04 +0400:
TVE> Мне нужно на Perl сделать что-то вроде cat, то есть читать бинарные
TVE> данные и записывать куда-нибудь. Данных может быть очень много,
TVE> поэтому записать их все в память, а потом записать на диск не получится.
TVE> Делаю следующее:
TVE> syswrite OUT, $str while (sysread SRC, $str, 1_000_000);
TVE> если OUT сделать псевдонимом STDOUT и шеллом перенаправить этот STDOUT
TVE> в файл, то это работает раз в шесть-семь (!) быстрее, чем когда я явно
TVE> открываю OUT через open(). Почему? Я неправильно выбрал размер LENGTH
TVE> в sysread? Вообще, как наиболее эффективно организовать прямую передачу
TVE> данных в Perl?
TVE> Спасибо.
Вообще-то буферизованный вывод в perl делается через read/print, а не
через sysread/syswrite. Но вот насчет "в частности" неочевидно. Разве
что после каждого syswrite делается fsync? Да вроде не
должно... Может, конечно, артефакт того, что открывается через open()
(для sys* надо и открывать через sysopen), но такая возможность тоже
больше похожа на чисто теоретическую, а проверять лениво.
--
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru
Все учтено могучим ураганом...
Reply to: