LINUX.ORG.RU

Ремейк coreutils. Производительность VS традиции.

 , , , ,


0

2

Прочитал я статью про /bin/true и кучу ее версий. Потом подумал посмотреть, что да как в моем Debian:

root@server:~# /bin/true --version
true (GNU coreutils) 8.5
Copyright (C) 2010 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <http://gnu.org/licenses/gpl.html>
Это свободное ПО: вы можете продавать и распространять его.
Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.

Автор программы — Jim Meyering.


Суть даже не в том, на кой черт столько версий. Суть в том, что если программу переписывали кучу раз и она, ничего не делая, весит 20 (!) килобайт, то что-то здесь не так.
В общем, я переписал (какое громкое слово) ее на nasm и собрал. Объем уменьшился в ~40 раз. А потом - самое веселое, тестирование производительности.
Для этого использовался следующий скрипт:

#!/bin/bash
i=0
date
until [ $i -eq 220000 ]
do
/bin/true
  i=$[$i+1]
done
date


После этого в скрипте /bin/true меняется на ./true и тест повторяется.
Тест проводился на Debian Stable x64, Xeon E3-1235 Sandy Brige, 16gb RAM DDR3 1333.

Результаты:
/bin/true - 61 sec
./true - 32 sec

C /bin/false все примерно так же. Еще сравнивал с true из busybox на нетбуке с slitaz. Ее nasm-версия обгоняет не в 2, а примерно, в полтора раза.


Я даже не знаю, что мне спросить. Зачем в ЭТИХ программах Си? Почему они такие медленные? Почему даже busybox, который призван работать на встраиваемых и маломощных железяках не использовал такой подход? Я понимаю, что vi на nasm или gas переписать - мрак и ужас. Но cat, mount, ls, true, false и еще многие - вполне возможно. И даже я бы мог это сделать, если бы захотел. Другой вопрос в том, что системное программирование в Linux прибито гвоздями к сишечке. Неужели от нее не откажутся даже ради прироста производительности?
Даже двойного?

★★

Последнее исправление: horonitel (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

В info описаны такие ситуации:

   Note, however, that it is possible to cause `true' to exit with
nonzero status: with the `--help' or `--version' option, and with
standard output already closed or redirected to a file that evokes an
I/O error.  For example, using a Bourne-compatible shell:

     $ ./true --version >&-
     ./true: write error: Bad file number
     $ ./true --version > /dev/full
     ./true: write error: No space left on device

GotF ★★★★★
()
Ответ на: комментарий от Eddy_Em

Дело не в том, зачем, а в том, что можно в принципе заставить программу вести себя неожиданным образом. Я согласен, что эти примеры в реальной жизни едва ли возможны, но предупредить о них всё же стоит.

GotF ★★★★★
()

Вообще, очень жаль что так случилось с asmutils. Кстати этот ваш кат там был. и wget.

horonitel ★★
() автор топика

На современных процессорах даже скриптовые языки не создают проблем со скоростью, а ты тут с асмом крохоборствуешь.

max_udoff
()
Ответ на: комментарий от horonitel

Даже двойного?

Ты сравнивал на вырожденном примере, перепиши, например, ls и сравни.

а GAS вроде как кучу архитектур поддерживает.

Жжошь.

Begemoth ★★★★★
()
Ответ на: комментарий от Eddy_Em

Ява до сих пор тормозит жутко

На нищенском говножелезе - может быть :)

max_udoff
()
Ответ на: комментарий от horonitel

Это было практически неизбежно. Мало написать, нужно ещё и поддерживать, а тут мало у кого хватит энтузиазма.

GotF ★★★★★
()

ты курил The Rise of Worse Is Better ?

там ответы на твои страдания.

зы plan9port используй.

qulinxao ★★☆
()
Ответ на: комментарий от GotF

эти примеры в реальной жизни едва ли возможны

Что не возможного в том, что при редиректе в файл в вечном цикле на партиции закончится свободное место?!?

Вы тут совсем с ума посходили, штоле?..

LamerOk ★★★★★
()
Ответ на: комментарий от Eddy_Em

На кой черт так делать?

Затем, чтобы в результате был нормальный продукт, а не студентческая поделка.

LamerOk ★★★★★
()
Ответ на: комментарий от dt1

true и false (и много чего ещё) давно встроенные команды shell

r2d2
()
Ответ на: комментарий от encyrtid

Замени в моем «огрызке» 0 на EXIT_SUCCESS и отвали.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от GotF

Ну, я просто очень сомневаюсь, что кто-то направляет номер версии или справку /bin/true в файл %_%

Перенаправляют вывод всего скрипта, в котором в т.ч. может быть и распечатка версии конкретной программы. Ввод-вывод - это всегда ввод-вывод, соответственно, всегда есть вероятность ошибки.

LamerOk ★★★★★
()

Т.е. ты предлагаешь переписать «cat, mount, ls, true, false и еще многие» на asm, под каждую архитектуру свой вариант и всё ради весьма сомнительного увеличения производительности, которого на реальной системе ты просто не увидишь?! Отсыпь мне того, что употребил, тоже попробую )))

erfea ★★★★★
()
Ответ на: комментарий от erfea

можешь переписать только под мою amd64

anonymous
()
Ответ на: комментарий от MKuznetsov

В треде уже штук 5 вариантов «true» одинаково далёких от спецификации.

Ну вообще говоря http://pubs.opengroup.org/onlinepubs/009695399/utilities/true.html (IEEE Std 1003.1, 2004 Edition aka POSIX.1) единственное что говорит, так это то, что

The true utility shall return with exit code zero.

При этом не используя потоки ввода/вывода и не разбирая аргументы.

С другой стороны true из Coreutils действительно делает намного больше работы. Он поддерживает два ключа, которые обязательны для всех программ написанных в рамках проекта GNU ( http://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html ). "--version" используется для указания, кроме прочего, лицензии и указания кому принадлежит копирайт. Это нужно для того чтобы пользователь знал как он может распоряжаться программой, не нарушая законодательство. "--help" даёт возможность получить справку даже на машинах без рабочего man. А это нередко бывает в не-юниксовых инсталляциях.

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

Из-за всего этого по умолчанию бинарник в случае сборки coreutils 8.3 получается размером 70 килобайт и после «strip -s» становится равным 20 килобайтам, которые и весит, например, в Debian.

В принципе можно этот размер уменьшать. Например при сборке с "-ffunction-sections -fdata-sections -Os -Wl,--gc-sections" получается бинарник весом в 14 килобайт.

kim-roader ★★
()
Ответ на: комментарий от kim-roader

С другой стороны true из Coreutils

в том то и дело что true следует всем соглашениям принятым в coreutils и именно отсюда следуют --help и --version и вытекающая оттуда работа с потоками.

собсна основа вопроса поднятого ТС - coreutils не оптимален в конкретике. Ну да, не оптимален - но coreutils сделан не только для i86 и не только для linux. Все приведённые примеры true на ассемблере не будут работать без костылей например в BSD на той-же аппаратной основе (там другие соглашения о системных вызовах). + не могут будут собраны например на AIХ.

ТС не думал о практике применения утилит, о накладных расходах шелл и ядра на запуск и завершение внешней программы, о том почему при наличии встроенной функции остаётся отдельный бинарник. И так далее.

Вообще весь тред - блестящий пример конца сессии и брожения умов. Такое бывает из года в год, человека научили что-либо делать, но зачем и как это правильно применить он ещё не знает.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Я учился на филологическом факультете, если это вдруг обо мне. Там ассемблер не преподают.

horonitel ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.