Почему использует && в 75 раз быстрее, чем если бы … fi и как сделать код более четким

У меня есть свои программы, посылают мне электронные письма или звуковой сигнал консоль, когда они закончены. Я использую && символ, который говорит консоли ожидать предыдущей команды для окончания, и я заканчиваю все это другим и получить контроль консоли назад.

Таким образом, Ваш пример был бы похож на это:

склонный - получают-b источник packagename && сон 10 && слабых соперников "Завершенное задание компиляции". И

Я добавляю сон 10 в придачу. Обратите внимание, что я не знаю слабый синтаксис.

Кроме того, не используя слабого соперника, Вам могло бы понравиться использовать mailx, чтобы послать Вам электронные письма или сообщения txt, или повторить-a "\a" для подачи звукового сигнала консоли вместо этого.

38
04.01.2015, 17:40
2 ответа

Это потому, что вы каждый раз порождаете подоболочку:

if ([ $remainder == 0 ] && [ $is_prime == true ]); then

Просто удалите скобки

if [ $remainder == 0 ] && [ $is_prime == true ]; then

Если вы хотите сгруппировать команды, есть синтаксис, чтобы сделать это в текущей оболочке:

if { [ $remainder == 0 ] && [ $is_prime == true ]; }; then

(требуется точка с запятой, см. в руководстве )

Обратите внимание, что [ is_prime ] не то же самое, что [ $is_prime == true ]: можно написать, что это просто $is_prime (без скобок), которая вызовет встроенную команду bash true или false.
[ is_prime ] - это тест с одним аргументом, строка "is_prime" -- когда [ дается один аргумент, результат успешен, если аргумент не пустой, а строка литерала всегда не пуста, следовательно, всегда "true".

Для удобочитаемости я бы изменил очень длинную строку

[ $is_prime == true ] && echo "${number_under_test} is prime!" || echo "${number_under_test} is NOT prime (factors= $factors)"  [ $is_prime == true ] && largest_prime=$number_under_test

на

if [ $is_prime == true ]; then
  echo "${number_under_test} is prime!"
else 
  echo "${number_under_test} is NOT prime (factors= $factors)"
  # removed extraneous [ $is_prime == true ] test that you probably
  # didn't notice off the edge of the screen
  largest_prime=$number_under_test
fi

Не стоит недооценивать пробелы для большей ясности.

66
27.01.2020, 19:36

Я думаю, что вы работаете слишком сложно с этой функцией вашего. Рассмотрим:

unset num div lprime; set -- "$((lprime=(num=(div=1))))"
while [     "$((     num += ! ( div *= ( div <= num   ) ) ))" -eq \
            "$((     num *=   ( div += 1 )   <= 101   ))" ]    && {
      set   "$(( ! ( num %      div )         * div   ))"     "$@"
      shift "$(( !    $1 +    ( $1 ==  1 )    *  $#   ))"
}; do [ "$div" -gt "$num" ] && echo "$*"      
done

арифметика оболочки довольно способна оценивать целочисленные условия самостоятельно. Редко требуется слишком много испытаний и / или внешних заданий. Этот , в то время как в то время как петля дублирует ваши вложенные петли справедливо хорошо:

Это не печатает столько, конечно, я не писал все так, но, например, устанавливая потолок до 16 чем 101, как написано выше и ...

2
3
4 2
5
6 3 2
7
8 4 2
9 3
10 5 2
11
12 6 4 3 2
13
14 7 2
15 5 3

Это определенно делает работу. И это требует очень мало для приближения вашего выхода:

...
do [ "$div" -eq "$num" ] && shift &&
   printf "$num ${1+!}= prime.${1+\t%s\t%s}\n" \
          "factors= $*"                        \
          "lprime=$(( lprime = $# ? lprime : num ))"
done

просто делает это, а не в Echo и ...

1 = prime.
2 = prime.
3 = prime.
4 != prime.     factors= 2      lprime=3
5 = prime.
6 != prime.     factors= 3 2    lprime=5
7 = prime.
8 != prime.     factors= 4 2    lprime=7
9 != prime.     factors= 3      lprime=7
10 != prime.    factors= 5 2    lprime=7
11 = prime.
12 != prime.    factors= 6 4 3 2        lprime=11
13 = prime.
14 != prime.    factors= 7 2    lprime=13
15 != prime.    factors= 5 3    lprime=13

это работает в BusyBox . Это очень портативный, быстрый и простой в использовании.

Ваша проблема поддона будет происходить в большинстве снарядов, но это, по далеко , наиболее острым в Bash bash . Я чередовался между Drey

( [ "$div" -gt "$num" ] ) && ...

... И то, как я написал его выше в нескольких снарядах для потолка 101 и Dash сделал это без подполей в 0,017 секунды и с подполюбом за 1,8 секунды. Bitebox .149 и 2, ZSH 0,49 и 4, Bash .35 и 6, а ksh93 в 0,49 и .160. ksh93 не вило для подполей, поскольку другие оболочки должны. Поэтому, возможно, проблема не так много подполей, поскольку это Shell .

9
27.01.2020, 19:36

Теги

Похожие вопросы