2011年09月04日
シェルスクリプトの計算速度
職場の新人にシェルスクリプトの課題を出してみた
内容は下の表示例の出力をするシェルスクリプトを作成するというもの
表示例
0 + 1 = 1
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
・
・
・
4950 + 100 = 5050
というふうに
最終的には100まで足し算をしていくシェルスクリプトだ
最初は10までで作成させようと準備していたんだけど
大量の計算を伴うと
シェルスクリプトの内容で大きく処理速度が左右されることを
新人に教えたかったので100までの計算としてみた
するとやはりシェルスクリプトに不慣れな新人は
結果は表示例と同じなのだが
速度がとても遅い以下のようなスクリプトを組んで提出してきた
#SLOW
#!/bin/bash
tmp=0
for no in {1..100}
do
ans=`expr $tmp + $no`
echo "${tmp} + ${no} = ${ans}"; tmp=$ans
done
新人のスクリプトはたしかに結果は出るが
exprで計算させているのが処理を遅くしている
#FAST
#!/bin/bash
tmp=0
for((i=1; i<=100; i++))
do
let ans+=i
echo "${tmp} + ${i} = ${ans}"; tmp=$ans
done
for文の条件を繰り返し回数の判定のみとし
計算部分は高速なlet関数を使用している
for文の条件部分は新人のスクリプトのものでも
シェルスクリプトの変数は
文字列と数値の区別がない為まったく問題はないが
計算させる為の方法に何を使用してスクリプトを組むかで
計算を苦手とするシェルスクリプトは
かなり速度に差がでるようになる
ここはシェルスクリプトの中で注意が必要な部分だ
内容は下の表示例の出力をするシェルスクリプトを作成するというもの
表示例
0 + 1 = 1
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
・
・
・
4950 + 100 = 5050
というふうに
最終的には100まで足し算をしていくシェルスクリプトだ
最初は10までで作成させようと準備していたんだけど
大量の計算を伴うと
シェルスクリプトの内容で大きく処理速度が左右されることを
新人に教えたかったので100までの計算としてみた
するとやはりシェルスクリプトに不慣れな新人は
結果は表示例と同じなのだが
速度がとても遅い以下のようなスクリプトを組んで提出してきた
#SLOW
#!/bin/bash
tmp=0
for no in {1..100}
do
ans=`expr $tmp + $no`
echo "${tmp} + ${no} = ${ans}"; tmp=$ans
done
新人のスクリプトはたしかに結果は出るが
exprで計算させているのが処理を遅くしている
#FAST
#!/bin/bash
tmp=0
for((i=1; i<=100; i++))
do
let ans+=i
echo "${tmp} + ${i} = ${ans}"; tmp=$ans
done
for文の条件を繰り返し回数の判定のみとし
計算部分は高速なlet関数を使用している
for文の条件部分は新人のスクリプトのものでも
シェルスクリプトの変数は
文字列と数値の区別がない為まったく問題はないが
計算させる為の方法に何を使用してスクリプトを組むかで
計算を苦手とするシェルスクリプトは
かなり速度に差がでるようになる
ここはシェルスクリプトの中で注意が必要な部分だ
シェルスクリプトでcsvを扱う(bash)その2
パスワードハッシュ生成スクリプト(Solaris10)
シェルスクリプトでcsvを扱う(bash)その1
シェルスクリプト(計算)
シェルスクリプト(変数の定義2)
シェルスクリプト(変数内容の表示)
パスワードハッシュ生成スクリプト(Solaris10)
シェルスクリプトでcsvを扱う(bash)その1
シェルスクリプト(計算)
シェルスクリプト(変数の定義2)
シェルスクリプト(変数内容の表示)
Posted by タカさん at 18:32│Comments(0)
│ShellScript