The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Релиз командного интерпретатора Bash 5.1, opennews (?), 08-Дек-20, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


153. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 08-Дек-20, 19:12 
Bash такой же  как и system:D мегакусок говнокода.

А 5.1 ещо более тормозное и размазаное удобрение чем 5.0:
time bash-5.0 -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'

real    0m6,178s
user    0m6,173s
sys     0m0,005s

time bash-5.1 -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'

real    0m7,184s
user    0m7,184s
sys     0m0,001s

time dash-0.5.10.2 -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'

real    0m2,186s
user    0m2,185s
sys     0m0,001s

Скомпилировано и сконфигурировано на OpenSUSE.
ПС: кто не понял — в этом примере dash на 329% быстрее исполняет скрипт чем bash-5.1

Ответить | Правка | Наверх | Cообщить модератору

180. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (180), 08-Дек-20, 20:37 
Баш вообще в циклах хреново работает, ты бы ещё файл построчно читать попробовал. Вот попробуй, охренеешь.
Поэтому циклы лучше на линуксовые утилиты положить, а не на баш. Башу только управление софтом, переменными, функциями можно и это реально бомба.
Ответить | Правка | Наверх | Cообщить модератору

184. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 08-Дек-20, 20:45 
> Баш вообще в циклах хреново работает, ты бы ещё файл построчно читать
> попробовал. Вот попробуй, охренеешь.
> Поэтому циклы лучше на линуксовые утилиты положить, а не на баш. Башу
> только управление софтом, переменными, функциями можно и это реально бомба.

Мне вот нада скриптом управлять скоростью вентилятора следя за термодатчиками, используя простую арифметику делать плавное увеличение\уменьшение оборотов.
Я написал скрипт весом 4 кб на sh, 4 года работает без проблем.
На какие альтернативы среди утилит положыть эту логику?

Ответить | Правка | Наверх | Cообщить модератору

186. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (180), 08-Дек-20, 20:58 
Да для таких простых задач баш пригоден. Я имею ввиду какие-то жёсткие задачи, типо анализа текстового файла в десятки гигабайт, или запуска каких-то команд где очень быстро будет передаваться управление обратно в цикл, и весь скрипт из-за этого будет тормозить, упираться в баш.
Ответить | Правка | Наверх | Cообщить модератору

203. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (180), 08-Дек-20, 22:28 
Ну и эта команда на которой ты тестриуешь баш это не есть показать. У тебя простой цикл с инкриментом. Ну о чём это говорит вообще? Это не ЯП, это скриптовый, управлеченский код, нагруженные циклические проги прямо на него накидывать это бред, неэффективно.
Баш в этой ситуации медленнее питона, но просто потому что ты баш применил так. А вот питон по другому не применить уже, вот это разница.
Ответить | Правка | К родителю #153 | Наверх | Cообщить модератору

211. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 08-Дек-20, 22:48 
> Это не ЯП, это скриптовый, управлеченский код, нагруженные циклические
> проги прямо на него накидывать это бред, неэффективно.

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

ПС: питон не эфективен, юзай асм.

Ответить | Правка | Наверх | Cообщить модератору

207. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 08-Дек-20, 22:34 
Зачем тебе баш если ты его не используешь?..

~ $ time bash -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'

real    0m6.578s
user    0m6.569s
sys     0m0.000s

~ $  time bash -c 'D=1; while [[ "$D" -lt 1000000 ]]; do ((D+=1)); done'

real    0m3.558s
user    0m3.551s
sys     0m0.001s

~ $  time bash -c 'declare -i D=1; while ((D<1000000)); do ((D+=1)); done'

real    0m2.510s
user    0m2.505s
sys     0m0.001s

то же самое с регулярками и всем остальным

Ответить | Правка | К родителю #153 | Наверх | Cообщить модератору

215. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 08-Дек-20, 23:23 
А вот, кстати, zsh (но он по фичам несовместим с башем, да):

 ~ $  time zsh -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'

real    0m4.796s
user    0m4.470s
sys     0m0.321s

~ $  time zsh -c 'D=1; while [[ "$D" -lt 1000000 ]]; do ((D+=1)); done'

real    0m1.131s
user    0m1.129s
sys     0m0.001s

~ $  time zsh -c 'D=1; while ((D<1000000)); do ((D+=1)); done'

real    0m0.868s
user    0m0.867s
sys     0m0.000s

~ $  time zsh -c 'declare -i D=1; while ((D<1000000)); do ((D+=1)); done'

real    0m0.681s
user    0m0.680s
sys     0m0.000s


Ответить | Правка | Наверх | Cообщить модератору

217. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 08-Дек-20, 23:41 
Тогда уже не "((D+=1))", а "((D++))" наверно.

Даже такими титаническими усилиями оно значительно медленнее даша. А также у меня огромные вопросы к смыслу таких усилий и того какое это имеет отношение к shell.

ПС: я тоже читерить умею
time dash -c 'D=1; while true; do case "$D" in 1000000) exit;; esac; D="$((D+1))"; done'

real    0m0,964s
user    0m0,958s
sys     0m0,004s

Ответить | Правка | К родителю #207 | Наверх | Cообщить модератору

218. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 08-Дек-20, 23:55 
> Тогда уже не "((D+=1))", а "((D++))" наверно.

А какая разница?

> Даже такими титаническими усилиями оно значительно медленнее даша. А также у меня
> огромные вопросы к смыслу таких усилий и того какое это имеет
> отношение к shell.

Что там титанического? В моём коде ничего титаническго, совершенно 0 усилий. Никаких хаков. Я всегда только так и пишу.

 ~ time dash -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'

real    0m1.740s
user    0m1.738s
sys     0m0.000s

$  time dash -c 'D=1; while true; do case "$D" in 1000000) exit;; esac; D="$((D+1))"; done'

real    0m1.097s
user    0m1.095s
sys     0m0.001s

$  time zsh -c 'declare -i D=1; while ((D<1000000)); do ((D+=1)); done'

real    0m0.682s
user    0m0.681s
sys     0m0.000s

Итого, даш даже с грязнохаками слился "башизмам".

Ответить | Правка | Наверх | Cообщить модератору

222. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 09-Дек-20, 00:50 
>> Тогда уже не "((D+=1))", а "((D++))" наверно.
> А какая разница?

Если б bash нормально был написан то наверно никакой бы небыло, но по факту быстрее.

>> Даже такими титаническими усилиями оно значительно медленнее даша. А также у меня
>> огромные вопросы к смыслу таких усилий и того какое это имеет
>> отношение к shell.
> Что там титанического? В моём коде ничего титаническго, совершенно 0 усилий. Никаких
> хаков. Я всегда только так и пишу.

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

> Итого, даш даже с грязнохаками слился "башизмам".

Слился в чом, в сложении? xD
И да, я з zsh не знаком, по этому ничего про него сказать не могу, в отличии от забаганого баша.

Ответить | Правка | Наверх | Cообщить модератору

227. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 09-Дек-20, 01:19 
Какие баги? Нет никаких багов. А по синтаксису, это обычный bash синтаксис и встроенный оператор объявления массивов, переменных, объявления переменных глобальными и всего остального, ему уж лет сколько. От объявления переменной числом баш не выигрывает на таком "тесте", это зш оптимизирует на 20% или сколько там, но вообще для счётчиков довольно эффективно. Я просто объявляю все числа числами, очень удобно.

Вон там соседний ответ, расскажи пожалуйста, как удалить последний элемент массива в dash и как складывать числа в dash, я хочу сравнить производительность на сложении чисел (числа простые строки в массиве, без всего).

Ответить | Правка | Наверх | Cообщить модератору

273. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 09-Дек-20, 19:29 
>Я просто объявляю все числа числами, очень удобно.

А я не обьявляю числа числами так как в этом нет необходимости — ещо удобнее.
>Вон там соседний ответ, расскажи пожалуйста, как удалить последний элемент массива в dash и как складывать числа в dash, я хочу сравнить производительность на сложении чисел (числа простые строки в массиве, без всего).

raye="2 4 8 16 32 64 128 256 512 1024"
raye="${raye% *}"
echo "$raye"

На какую купку складывать?

Ответить | Правка | Наверх | Cообщить модератору

279. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 09-Дек-20, 22:42 
А ничего особенного, типичная задача сложить миллион другой чисел, что такого. Как узнать в даше что это даш? Я так понял сложение чисел это слишком сложная задача для даша, поскольку массивов нет количество элементов я тоже узнать не могу? Это фейл. Как мне получить последнее значение в строке? Его нужно сохранить в отдельную переменную и только потом удалить. А нное значение? Зачем нужен шел который не умеет даже таких базовых вещей? Тот же tcsh и то больше может, хотя казалось бы. Но, тот складывать вообще не умеет, так что массивы ему не помогут.

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

Ещё не понял, почему у даша в конце 3 значения к удалению, когда у баша и зш их 2 (вообще должно быть одно, но просто файл такой). Я удаляю любые повторяющиеся значения в цикле проверяя корректность содержимого регуляркой, чего даш тоже не умеет. Можно нагородить сед наверно, но мне лень.

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

raye="${raye%
*}"
поскольку башевого $'\n' тоже нет.

Потребление памяти у даша 32мб и у баша 200мб, у зш 90мб. Ну т.е. в принципе пусть живёт, но это насилие над пользователем, а не шел -- куча "нельзя". У баша без массива потребление памяти  120 мегабайт и у зш 15мб (я не уверен что сделал это корректно, for по строке разделённой \n он что-то не смог похоже).

Получается зш практически однозначный победитель, он позволяет использовать разнообразные башизмы и при этом наиболее эффективен.

Интересный факт: если избежать присвоения копии массива в zsh (поскольку он может только копировать, но не занулять? значит, неосуществимо) его потребление памяти в варианте с массивом падает в 2 раза до 50мб.

Ответить | Правка | Наверх | Cообщить модератору

280. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 10-Дек-20, 00:05 
>Как узнать в даше что это даш?

whatshell.sh
>Я так понял сложение чисел это слишком сложная задача для даша, поскольку массивов нет количество элементов я тоже узнать не могу? Это фейл.

Стопэ. Отстань со своими ращосками от тех у кого нет волос. ;)
Вот тебе красивая сума всех аргументов и без масивов:
raye(){
SUM=0
N=$#
while [ -n "$1" ]
do
SUM=$((SUM+$1))
shift
done
}
raye 2 4 8 16 32 64 128 256 512 1024
echo "Z$N: $SUM"

И через $2 внутри функцыи можна обращаться к конкретной позицыи.

>Но, блин, серьёзно, шел без массивов это что-то ты даже параметры не сможешь передать программе поскольку они будут одной строкой

Ой, нет, без волос не умирают. Нет, мозги не испарятся без них. А если холодно есть кепка.
# yes "1
2
3
4"

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

А как они добавляются в волосы, ой, то есть в масив?
Я с масивами никогда не работал и до сих пор не понимаю нашо они нада.

Ответить | Правка | Наверх | Cообщить модератору

224. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 09-Дек-20, 01:11 
tcsh похоже победитель:

 $  time tcsh ~/bin/cshvariant.sh

real    9m20.743s
user    6m18.812s
sys     3m31.950s

Бтв как удалить последний элемент из массива в zsh?

Вот это чёт не прокатывает unset 'raye[${#raye[@]}-1]' (в баше работает), а то в баше я просто напишу unset raye[-1] и всё норм.

Короче только вот так, raye=("${(@)raye[1,$#raye-1]}")

В итоге, на более реальной задаче баш складывает несколько чисел (300000 чисел) за

real    0m34.796s
user    0m2.884s
sys     0m3.044s

и зш за

real    0m35.218s
user    0m2.913s
sys     0m3.113s

вот и всё. :(

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

Ответить | Правка | К родителю #218 | Наверх | Cообщить модератору

208. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (180), 08-Дек-20, 22:37 
~$ time bash -c 'declare -i D=1; while ((D<1000000)); do ((D+=1)); done'

real    0m4.937s
user    0m4.925s
sys    0m0.004s


На процессоре 2006 года релиза.

Ответить | Правка | К родителю #153 | Наверх | Cообщить модератору

214. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от VINRARUS (ok), 08-Дек-20, 23:16 
А с dash?
Ответить | Правка | Наверх | Cообщить модератору

225. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (263), 09-Дек-20, 01:11 
Забавный тест, вот другой, где все "несколько иначе":
~> time dash -c 'for a in `seq 100000`; do ( :; ); done'
    0m14.03s real     0m09.18s user     0m08.42s system
~> time ash -c 'for a in `seq 100000`; do ( :; ); done'
    0m45.92s real     0m33.87s user     0m15.39s system
~> time mksh -c 'for a in `seq 100000`; do ( :; ); done'
    0m18.92s real     0m12.37s user     0m10.22s system
~> time bash -c 'for a in `seq 100000`; do ( :; ); done'
    0m24.39s real     0m16.00s user     0m13.59s system

Занимательно, что твой тест в ash просто летает:
~> time dash -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'                                                        
    0m02.59s real     0m02.58s user     0m00.00s system
~> time ash -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'                                                          
    0m04.02s real     0m03.67s user     0m00.34s system
~> time mksh -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'                                                        
    0m04.80s real     0m04.79s user     0m00.00s system
~> time bash -c 'D=1; while [ "$D" -lt 1000000 ]; do D="$((D+1))"; done'                                                        
    0m09.51s real     0m09.49s user     0m00.00s system

dash-0.5.10.2
bash-5.0.17
mksh-59
busybox-1.31.1

Ответить | Правка | К родителю #153 | Наверх | Cообщить модератору

233. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 09-Дек-20, 01:45 
Отличные "тесты", ага. Десятиминутный победитель из того теста справился тут за секунду.

$  time tcsh ~/bin/cshseq.sh

real    0m1.250s
user    0m0.765s
sys     0m0.469s
$  time dash -c 'for a in `seq 100000`; do ( :; ); done'

real    0m14.488s
user    0m8.667s
sys     0m6.319s
$  time bash -c 'for a in `seq 100000`; do ( :; ); done'

real    0m36.407s
user    0m19.588s
sys     0m17.738s
$  time zsh -c 'for a in `seq 100000`; do ( :; ); done'

real    0m45.363s
user    0m22.131s
sys     0m25.281s


Ответить | Правка | Наверх | Cообщить модератору

237. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (263), 09-Дек-20, 02:07 
Хз, что у тебя в скрипет, а у меня:
~> cat t.tcsh
foreach a (`seq 100000`)
(:;)
end
~> time tcsh t.tcsh
    0m26.02s real     0m16.09s user     0m15.83s system
Ответить | Правка | Наверх | Cообщить модератору

238. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 09-Дек-20, 02:13 
#/bin/tcsh
foreach i ( `seq 100000` )
   :;
end

можно с echo "$i" -- ровно то же самое.

Ответить | Правка | Наверх | Cообщить модератору

240. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 09-Дек-20, 02:17 
В шебанге опечатка, но я скармливал интерпретатору поэтому не важно.
Ответить | Правка | Наверх | Cообщить модератору

261. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (261), 09-Дек-20, 14:26 
В dash/bash круглые скобки форкают sub-shell. Я так понимаю, скрипт tcsh этого не делает, так что тест некорректен.
Ответить | Правка | К родителю #238 | Наверх | Cообщить модератору

266. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (263), 09-Дек-20, 15:00 
> В dash/bash круглые скобки форкают sub-shell. Я так понимаю, скрипт tcsh этого
> не делает, так что тест некорректен.

https://linux.die.net/man/1/tcsh

Builtin and non-builtin command execution

Builtin commands are executed within the shell. If any component of a pipeline except the last is a builtin command, the pipeline is executed in a subshell.

Parenthesized commands are always executed in a subshell.
    (cd; pwd); pwd
thus prints the home directory, leaving you where you were (printing this after the home directory), while
    cd; pwd
leaves you in the home directory. Parenthesized commands are most often used to prevent cd from affecting the current shell.

Ответить | Правка | Наверх | Cообщить модератору

278. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (261), 09-Дек-20, 22:11 
О том и речь.
Ответить | Правка | Наверх | Cообщить модератору

241. "Релиз командного интерпретатора Bash 5.1"  +/
Сообщение от Аноним (16), 09-Дек-20, 02:20 
В общем да на (:;) выдало это

real    0m46.337s
user    0m24.146s
sys     0m24.104s

Ответить | Правка | К родителю #237 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру