LINUX.ORG.RU
ФорумTalks

Код, который мы все пишем...

 ,


3

1

OpenSource многие пользуются и очень немногие пишут для OpenSource. Но многие из нас из нас пишут каждый день строк этак по 100, а то и больше, кода на Shell=~/(c|k|z|ba)sh/. И не делятся друг с другом, и огромный сегмент OpenSource попросту пропадает втуне. Почему? Я думаю, в первую очередь всё-таки из-за того, что shell очень медленный и мало кто решается на нём писать что-то серьёзное и юзабельное для неограниченного множества людей.
Так, может, стоить пнуть посильнее разработчиков того же BASH'а, чтобы они его оптимизировали, интенсифицировав таким образом возможности скритпообмена через github и sourceforge в разы?

★★★★★
Ответ на: комментарий от megabaks

тут скорее дело в том, что приходится постоянно что-то дёргать в больших кол-вах

К сожалению, это не подтверждается практикой: нативный код на BASH работает медленнее, чем тоже самое, но с использованием sed'ов и grep'ов. В связи с этим складывается ощущение, что сам BASH написан с точки зрения оптимизации скорости написан наихудшим образом из всех возможных.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny
$ man bash | grep -A 1 BUGS
BUGS
       It's too big and too slow.

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

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

Вроде соответствует действительности, зачем убирать?

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

нативный код на BASH работает медленнее, чем тоже самое, но с использованием sed'ов и grep'ов.

4.2
вот только что попробовал заменить

[[ "${1}" == *:* ]]
на
grep -q ":" <<< "${1}"
+0.7 сек
а если, помимо грепа выше, ещё заменить 2 вызова sed-а на баш, то время на 1000 циклов уменьшается с 8 сек, до 7-6.9

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

Взять массив данных побольше, чтобы он обрабатывался достаточный период времени за один вызов grep/sed. Вывод пускать в /dev/null, а не в файл или консоль.

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

миллион ждать устал - вот 1000

[ megabaks@desktop ] ~ $ x(){ [[ "${1}" == *:* ]];}
[ megabaks@desktop ] ~ $ time for i in `seq 1000`;do x lol:lor;done

real    0m0.015s
user    0m0.013s
sys     0m0.002s
[ megabaks@desktop ] ~ $ x(){ grep -q ":" <<< "${1}";}
[ megabaks@desktop ] ~ $ time for i in `seq 1000`;do x lol:lor;done

real    0m4.824s
user    0m1.383s
sys     0m2.857s
[ megabaks@desktop ] ~ $ 
разница очевидна

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

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

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

Ты попробуй на нормальных regexp'ах, куски из строки подлиннее вычленять. Будешь удивлён :) см. BASH_REMATCH

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от megabaks
   if [[ -f "$csvSource" ]]; then    
    csv_row+=$(sed -nr "s%^${lon},\s*${lat},\s*([^,]+),?\s*$%,\1%"'; T lbl; p; q; :lbl; $s%.*%,'$UNDEF'%p' "$csvSource")
   else
    csv_row+=",$UNDEF"
   fi

Вот кусочек реального кода, который с использованием SED работал быстрее, чем с нативным BASH и его regex-движком.

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

ну началось...вот тебе вполне реальный пример.
потому заявлять что баш прям донельзя тормозит просто глупо

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

нативный код на BASH

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

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

Попробуй и зацени даже не разницу в работе «сравнивающих скобок», а количество времени, на которое различаются разные варианты. А ведь это каких-то 100000 циклов, не твой миллион!

#!/bin/bash
w4r () {
 echo 'some wait for random accumulation...'
 sleep 0.02
 return 0
}

echo 'Init random...'
for ((i=1; i<10000; i++)); do a=$RANDOM; b=$RANDOM; done
echo 'Begin the simple arithmetic comparisson test'

echo -en '\nQ="[", OP="-gt"'
time { for ((i=1; i<100000; i++)); do a=$RANDOM; b=$RANDOM; [ $a -gt $b ]; done; }
w4r

echo -en '\nQ="[[", OP="-gt"'
time { for ((i=1; i<100000; i++)); do a=$RANDOM; b=$RANDOM; [[ $a -gt $b ]]; done; }
w4r

echo -en '\nQ="[[", OP=">"'
time { for ((i=1; i<100000; i++)); do a=$RANDOM; b=$RANDOM; [[ $a > $b ]]; done; }
w4r

echo -en '\nQ="((", OP=">"; V="$a"'
time { for ((i=1; i<100000; i++)); do a=$RANDOM; b=$RANDOM; (( $a > $b )); done; }
w4r

echo -en '\nQ="((", OP=">"; V="a"'
time { for ((i=1; i<100000; i++)); do a=$RANDOM; b=$RANDOM; (( a > b )); done; }
w4r

echo 'THE END ;)'

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

Очевидно, что это очень медленно работает

Ага, как и регулярные выражения, как и hash-массивы...

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от megabaks
$ f(){ local i;for i in {1..100000};do echo lor:lol;done; }
$ bash_(){ local l;local i=0;while read l;do [[ "$l" == *:* ]] && ((i++));done;echo $i;}
$ grep_(){ grep -c ':';}
$ time f|bash_
100000

real	0m1.226s
user	0m1.373s
sys	0m0.227s
$ time f|grep_
100000

real	0m0.585s
user	0m0.657s
sys	0m0.173s
NeXTSTEP ★★
()
Ответ на: комментарий от NeXTSTEP

Иными словами, баш работает очень медленно. Но быстрые внешние утилиты, делающие ту же работу, вызываются ещё медленнее, сводя на нет их быстроту.

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

csv_row+=$(sed -nr «s%^${lon},\s*${lat},\s*([^,]+),?\s*$%,\1%»'; T lbl; p; q; :lbl; $s%.*%,'$UNDEF'%p' «$csvSource»)

Попробовал прочитать вслух. Как теперь избавиться от запаха серы и трёхметрового чувака с рогами?

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

Как теперь избавиться от запаха серы и трёхметрового чувака с рогами?

Снести его вместе с рогами и поставить православный Debian!

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