Sat Jul 18 01:50:41 JST 2015

bash (or zsh) で整数の四則演算

普通ある整数の四則演算のためのコマンドとして、 exprbc がある. expr は整数しか扱えなくて、 bc は浮動小数や任意精度も扱えるらしい.

他に、bashに組み込みのコマンドというか記法として $(( ))let とがある.

普通 '*' という文字は、bashによって、 カレントディレクトリにあるファイル名全てを空白でつないだ文字列に展開されてから、 コマンドに引数として渡される. 従って、 exprbc に渡すときにはちょっと面倒. 対して組み込みのコマンドの方は気にしなくていい.

速さ

知見として、 速度が全然違うので組み込みを使うべき.

それぞれの式で100回 \(10!\) を計算する:

gist

awk

を忘れてた.

% time ( for i in `seq 100`; do
seq 1 10 | awk -v prod=1 '{prod*=$1} END{print prod}' > /dev/null;
done )
real    0m0.126s
user    0m0.016s
sys     0m0.171s

awk を使うならこうだろうという書き方のつもりだけど、 例えば expr バージョンは一回の \(10!\) の計算に 10回 epxr を呼び出してるのに、 これは awk 一回しか起動してないのでアンフェアな気がする.

bc やり直し

% time ( for i in `seq 100`; do
seq 1 10 | tr '\n' '*' | sed 's/\*$/\n/' | bc > /dev/null;
done)

real    0m0.122s
user    0m0.029s
sys     0m0.302s

はい速い. でも文字列加工は若干気持ち悪いし、回りくどい. これなら awk でいい.

expr やり直し

こんなんしかできん

% time ( for i in `seq 100`; do
EXPR=`seq 1 10 | tr '\n' ' ' | sed 's/ *$//g' | sed 's/ / \\\\* /g'`;
bash -c "expr $EXPR";
done ) >/dev/null

real    0m0.318s
user    0m0.030s
sys     0m0.516s