&&を使用することがif...fiより75倍速い理由とコードをよりきれいにする方法

&&を使用することがif...fiより75倍速い理由とコードをよりきれいにする方法

次の作業コードがあります。

largest_prime=1
for number_under_test in {1..100}
do
  is_prime=true
  factors=''
  for ((divider = 2; divider < number_under_test-1; divider++));
  do
    remainder=$(($number_under_test % $divider))
    [ $remainder == 0 ] && [ is_prime ] && is_prime=false && factors+=$divider' '
  done
  [ $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
done
printf "\nLargest Prime= $largest_prime\n"

このコードは0.194秒の高速で実行されます。しかし、&& is_prime= false読書が少し難しく、(訓練されていない目には)設定されているのではなく、テストされているようです。それで&&an に変更してみたところif...then効果がありました。しかし、14.48秒で75倍遅かった。数字が高いほど最も目立つ。

largest_prime=1
for number_under_test in {1..100}
do
  is_prime=true
  factors=''
  for ((divider = 2; divider < number_under_test-1; divider++));
  do  
    remainder=$(($number_under_test % $divider))
    if ([ $remainder == 0 ] && [ $is_prime == true ]); then
      is_prime=false
      factors+=$divider' '
    fi  
  done
  [ $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
done  
printf "\nLargest Prime= $largest_prime\n"

鈍く見えずにブロックをシャープに保つ方法はありますか?

更新済み(2015年1月4日午前10時40分ET)

良いフィードバック!現在、以下を使用しています。他の提案はありませんか?

largest_prime=1
separator=' '
for number_under_test in {1..100}; {
  is_prime=true
  factors=''
  for ((divider = 2; divider < (number_under_test/2)+1; divider++)) {
    remainder=$(($number_under_test % $divider))
    if [ $remainder == 0 ]; then
      is_prime=false
      factors+=$divider' '
    fi
  } 
  if $is_prime; then
    printf "\n${number_under_test} IS prime\n\n"
    largest_prime=$number_under_test
  else
    printf "${number_under_test} is NOT prime, factors are: "
    printf "$factors\n"
  fi
}
printf "\nLargest Prime= $largest_prime\n"

ベストアンサー1

その理由は、毎回サブシェルを生成するからです。

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 ]簡単に書くと、bash組み込みまたはコマンドが呼び出されます。 1つの引数、文字列 "is_prime"を取るテストです。引数が与えられたときに引数が空でない場合、結果は成功し、リテラル文字列は常に空ではないため、常に「true」です。$is_primetruefalse
[ is_prime ][

読みやすくするために非常に長い行を変更します。

[ $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

明確さを高めるためにスペースを過小評価しないでください。

おすすめ記事