Re: Perl: эффективная буф еризация

2005-09-29 Пенетрантность Dmitry Baryshkov
On Wed, Sep 28, 2005 at 07:55:36PM +0400, Alexandra N. Kossovsky wrote:
> On Mon, Sep 26, 2005 at 12:56:13PM +0400, Dmitry Baryshkov wrote:
> 
> Важен не дескриптор полученный программой, а то, как пишут в файл на диске. 
> После пренеправления в файл на диске пишет bash, который использует
> libc'шную буверизацию. А сколько пайпов прошли данные до того, как их
> начали писать в файл -- совершенно неважно. Ну то есть можно написать всё
> настолько криво, что станет важно, но это не простая задача.

При перенаправлениях в файл, bash не занимается записью. Он только
открывает файл и делает dup2 (IIRC).

Позаглядывайте в /proc//fd, где  --- PID программы с
перенаправлениями.

-- 
With best wishes
Dmitry Baryshkov


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]



Re: Perl: эффективная буф еризация

2005-09-28 Пенетрантность Alexandra N. Kossovsky
On Mon, Sep 26, 2005 at 12:56:13PM +0400, Dmitry Baryshkov wrote:
> Hello,
> On Mon, Sep 26, 2005 at 09:56:58AM +0400, Alexandra N. Kossovsky wrote:
> > 
> > Что же касается скорости работы, читать/писать по мегабайту -- не самый
> > комфортный для ядра режим. Неудивительно, что когда вы через shell'овское
> > перенаправление включаете libc'шную буферизацию, всё начинает работать
> > лучше.
> 
> Интересно, как, на Ваш взгляд, связаны shell'овские перенаправления и
> libc'шная буфферизация? Ведь программа в любом случае получает
> дескриптор, а не FILE*.

Важен не дескриптор полученный программой, а то, как пишут в файл на диске. 
После пренеправления в файл на диске пишет bash, который использует
libc'шную буверизацию. А сколько пайпов прошли данные до того, как их
начали писать в файл -- совершенно неважно. Ну то есть можно написать всё
настолько криво, что станет важно, но это не простая задача.

> Скорее возможа разница в параметрах открытия файлов. Попробуйте
> посравнивать результаты fcntl(2) на дескрипторе, полученном при sysopen и
> на дескрипторе, полученном из shell.

И какое же отношение к "параметрам открытия файлов" имеет разница между pipe
и нормальным файлом?

-- 
Regards,
Sasha.
Alexandra N. Kossovsky, software engineer.
e-mail: [EMAIL PROTECTED]


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]



Re: Perl: эффективная буф еризация

2005-09-26 Пенетрантность Dmitry Baryshkov
Hello,
On Mon, Sep 26, 2005 at 09:56:58AM +0400, Alexandra N. Kossovsky wrote:
> 
> Что же касается скорости работы, читать/писать по мегабайту -- не самый
> комфортный для ядра режим. Неудивительно, что когда вы через shell'овское
> перенаправление включаете libc'шную буферизацию, всё начинает работать
> лучше.

Интересно, как, на Ваш взгляд, связаны shell'овские перенаправления и
libc'шная буфферизация? Ведь программа в любом случае получает
дескриптор, а не FILE*.

Скорее возможа разница в параметрах открытия файлов. Попробуйте
посравнивать результаты fcntl(2) на дескрипторе, полученном при sysopen и
на дескрипторе, полученном из shell.

> Видимо, следует повторить рекомендацию пользоваться буферизацией из libc,
> а не изобретать велосипед самостоятельно. Для этого, как уже сказано,
> в perl стоит использовать read/print.
> 

-- 
With best wishes
Dmitry Baryshkov


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]



Re: Perl: эффективная буф еризация

2005-09-26 Пенетрантность Timur V. Elzhov
On Mon, Sep 26, 2005 at 09:56:58AM +0400, Alexandra N. Kossovsky wrote:

> Я вообще-то подозреваю, что sysread/syswrite -- это интерфейс к read(2)
> & write(2).

Ну в документации к sysread/syswrite это прямым текстом говорится.

> Почти никакой буферизации при этом нет (буферизация может 
> быть на уровне ядра, но пользователю это обычно неинтересно). 
> fsync(3) имеет смысл только для потоков полученных fopen(3).
> 
> Что же касается скорости работы, читать/писать по мегабайту -- не самый
> комфортный для ядра режим. Неудивительно, что когда вы через shell'овское
> перенаправление включаете libc'шную буферизацию, всё начинает работать
> лучше.
> Видимо, следует повторить рекомендацию пользоваться буферизацией из libc,
> а не изобретать велосипед самостоятельно. Для этого, как уже сказано,
> в perl стоит использовать read/print.

Да пробовал я и это, ничего не изменилось. И потом, read имеет те же
самые аргументы, что и sysread, read тоже пишет в какой-то скаляр, и ему
тоже надо указывать количество считываемых байтов. Или пару read/print
нужно использовать как-то по-другому?


-- 
Best regards,
Timur Elzhov


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]



Re: Perl: эффективная буф еризация

2005-09-25 Пенетрантность Alexandra N. Kossovsky
On Mon, Sep 26, 2005 at 09:08:24AM +0400, Artem Chuprina wrote:
> 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?
> 
> Вообще-то буферизованный вывод в perl делается через read/print, а не
> через sysread/syswrite.  Но вот насчет "в частности" неочевидно.  Разве
> что после каждого syswrite делается fsync?  Да вроде не
> должно...  Может, конечно, артефакт того, что открывается через open()
> (для sys* надо и открывать через sysopen), но такая возможность тоже
> больше похожа на чисто теоретическую, а проверять лениво.


Я вообще-то подозреваю, что sysread/syswrite -- это интерфейс к read(2)
& write(2). Почти никакой буферизации при этом нет (буферизация может 
быть на уровне ядра, но пользователю это обычно неинтересно). 
fsync(3) имеет смысл только для потоков полученных fopen(3).

Что же касается скорости работы, читать/писать по мегабайту -- не самый
комфортный для ядра режим. Неудивительно, что когда вы через shell'овское
перенаправление включаете libc'шную буферизацию, всё начинает работать
лучше.
Видимо, следует повторить рекомендацию пользоваться буферизацией из libc,
а не изобретать велосипед самостоятельно. Для этого, как уже сказано,
в perl стоит использовать read/print.

-- 
Regards,
Sasha.
Alexandra N. Kossovsky, software engineer.
e-mail: [EMAIL PROTECTED]


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]