今回はShellを使った素数を求めるプログラムですが、デフォルトで100までの数値にしてますが、コマンド実行の際に、上限数値を与えるようにしてもいいかもしれないですね。
とりあえずは、幾つかの言語との速度差などを見たいので、同じ条件にする必要があるので、現状のまま処理します。
ソースコード
#!/bin/bash
function getPrimeNumber(){
num=`expr $1-1`
flg=0
for((i=2; i<$num; i++)){
m=`expr $1 % $i`
if [ $m -eq 0 ]; then
flg=$i
break
fi
}
echo $flg
}
# 受け渡し値の取得
numbers=($@)
for((i=2; i<=100; i++)){
res=`getPrimeNumber $i`
if [ $res -eq 0 ];then
numbers+=($i)
fi
}
echo ${numbers[@]}
実行
$ time bash prime_number.sh
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
real 0m1.776s
user 0m0.070s
sys 0m0.050s
コンソールで実行するのでtimeコマンドを付けて、実行時間も計測してみました。
前回のPHP,Pythonの速度計測と比べると、shellは非常に速度が遅いことが分かります。
ディスクIOは早いのに、計算系が弱いという事なんですね。
解説
shellでの数値計算
shellは多言語と違って、if文やfor文などで安易に数値を計算させる事はできません。
一度変数に入れるような処理を挟まないといけないので、面倒くさいと感じる人は多いでしょうね。
そして簡単な演算は以下の方法で実装しましょう。
num=10
res1=`expr $num+1`
res2=`expr $num-1`
res3=`expr $num*1`
res4=`expr $num/1`
res5=`expr $num%1`
getPrimeNumber関数内を少し変更
shellの関数はreturnではなく、echoで行うので文字列か数値で対応しなければいけないので、今回のアルゴリズムは、if文で判定してbooleanで返す、今までの方式ではなく、割り切れる数値がなければ"0"、割り切れれば、その数をechoで返すようにしてみました。
これにより、若干ですが、速度向上も見込めるでしょう。
リンク
色々なプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿