トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

bcbench

これなぁに?

bcbenchはとてもシンプルなベンチマークソフト(?)です。シェルスクリプトなので、一般的なUNI*Xで動作します。

もともとは、NBUGのおおしまさんが思いつかれたものです。(BSD Conference JAPAN 2005でも発表されています。)このページ(というかこのスクリプト)は、オリジナリティーはさっぱりまったくちっともありません。

やっていること

やっていることは、bc(1)で、円周率と自然対数の底を計算しています。time(1)で時間を計っています。

 echo "scale=2000; e(1)" | /usr/bin/time -p /usr/bin/bc -l 2>&1 >/dev/null
 echo "scale=2000; 4*a(1)" | /usr/bin/time -p /usr/bin/bc -l 2>&1 >/dev/null

必要なもの

time(1)とbc(1)を必要とします。bc(1)は"scale=2000"というオプションを与えて動作する必要があります。(NetBSD等のbc(1)では問題ありませんが、問題ある場合は、GNU bcをお使い下さい。)time(1)は"-p"オプション(POSIXオプション)を与えて動作する必要があります。

実行できなかったら、適切に書き換えて下さいな。(あるいは、上記を自分でタイプしてもいいです。)

なさそうなQA

  • Q:他の人結果と比較したいんだけど。
  • A:おおしまさんが2005年にまとめられた結果があります。cf.bc(1)で性能測定
  • A:蛯原さんが2009年にまとめられた結果等があります。cf.http://wiki.netbsd.se/bcbench 無くなりました。
  • Q:なんでtime(1)をつかっているの?
  • A: time(1)の"-p"オプションの方が、出力がみやすいと思っているだけで、それ以上の理由はありません。
  • Q:ベンチマークテストにならないと思うんだけど。
  • A:ベンチマークソフトだと思うか、ジョークソフトだと思うかは、人それぞれかと。isiharaはあまりまじめに考えていません。(bc(1)で性能測定のページで、おおしまさん曰く「ノリと勢いでやっているので、あまりまじめに比較する物ではありません:) 」。)
  • A:似たような事を考えていた人はいたみたいです。cf."command-line calculations using bc"
  • Q:極端に速さが違うんだけど。
  • A:bcの実装がOSによって異なるので、OS間を比較したい場合は、GNU bcで統一した方が無難です。
  • Q:配ってもいいの?改変してもいいの?
  • A:どうぞご自由に。(ライセンスを考えるほど、たいそうなものじゃありません。考えたい奇特な方は、ISCライセンスを適用すると思って下さい。)
  • Q:パッケージはないの?
  • A:NetBSDのバイナリーパッケージはこの下にあります。リポジトリはpkgsrc-wip-jpにあるので、このページの内容が古いと思った場合は、cvsを見て下さい。
  • Q:前のVer.がほしい。
  • A:http://www.rururu.org/~isihara/bcbench/ から持っていって下さい。
  • Q:意見がいいたい、パッチ送りたい、などなど。
  • A:このページのたぶん一番下にある、連絡先にメール下さい。(おおしまさんにはメールは送らないでね。)

スクリプト

 中身

#!/bin/sh

# bcbench - very simple benchmark tool(?)
# http://www.tunagu.gr.jp/cgi-bin/fswiki/wiki.cgi/isihara?page=bcbench (Japanese)
# http://www.tunagu.gr.jp/cgi-bin/fswiki/wiki.cgi/isihara?page=bcbench-e (Broken English)
#
# Please use GNU bc(1) when bc(1) cannot treat "scale=2000" option.
# Please use GNU time(1) when time(1) cannot treat "-p" option.
#
# e(1)   - e (base of natural logarithm) is calculated. 
# 4*a(1) - Pi is calculated. 

# ChangeLog:
# 20091106: Public Release. (Today is K-OF2009 at Osaka!)
# 20091108: When built-in time command was used, the bug to which the tool
#         : stopped was corrected.
# 20120109: It corrected that two or more options were not able to be specified.
#         : "-c" option was added. This is used when only one of the two of "pi"
#         : or "e" wants to calculate. 
#         : Output an error message to STDERR.
#         : Output a result to STDOUT.
# 20120112: "-o" option was added. select output format.

# Original idea by Oshima-san:
# cf. http://www.yagoto-urayama.jp/~oshimaya/nbug/etc/bench/index.html (Japanese,Presentation)
# cf. http://www.yagoto-urayama.jp/~oshimaya/nbug/etc/bench/bcbench.html (Japanese,Result summary)

VERSION=20120112

TIME=builtin
BC=builtin
SCALE=2000
CALC=both
OFORMAT=posix

while getopts b:c:ho:s:t:v i
do
        case "${i}" in
        b)
                BC="$OPTARG"
                ;;
        c)
                CALC="$OPTARG"
                ;;
        h)
                echo "Usage: $0 [-c kind_of_calc] [ -o output_format ] [-b /path/to/bc] [-t /path/to/time] [-s scale]"
                echo "Example: $0 -s 200"
                echo "Example: $0 -c pi -b /usr/local/bin/bc"
                echo "Example: $0 -c e -o csv"
                exit
                ;;
        o)
                OFORMAT="$OPTARG"
                ;;
        s)
                SCALE="$OPTARG"
                ;;
        t)
                TIME="$OPTARG"
                ;;
        v)
		echo "Version: bcbench $VERSION"
                echo "http://www.tunagu.gr.jp/cgi-bin/fswiki/wiki.cgi/isihara?page=bcbench (Japanese)"
                echo "http://www.tunagu.gr.jp/cgi-bin/fswiki/wiki.cgi/isihara?page=bcbench-e (Broken English)"
                echo "cf. http://www.yagoto-urayama.jp/~oshimaya/nbug/etc/bench/bcbench.html (Japanese)"
		exit
                ;;
        *)
                #break
		exit
                ;;
        esac
done

#
# check command path
#
if [ "$BC" = "builtin" ]; then
  which bc >/dev/null 2>&1
  [ $? -gt 0 ] && "ERR: bcbench requires bc(1)" 1>&2 && exit 1
  BC=$(which bc)
fi

cshf=1
zshf=1
if [ "$TIME" = "builtin" ]; then
  echo $SHELL | grep 'csh$' >/dev/null 2>&1
  cshf=$?
  echo $SHELL | grep 'zsh$' >/dev/null 2>&1
  zshf=$?
  if [ $cshf -eq 0 -o $zshf -eq 0 ]; then
    for h in /usr/bin/time /bin/time /usr/local/bin/time \
	     /opt/sfw/bin/time /opt/gnu/bin/time
    do
      if [ -x $h -a -f $h ]; then
	TIME=$h
        break
      fi
    done
    if [ "$TIME" = "builtin" ]; then
      "ERR: bcbench requires time(1)" 1>&2 && exit 1
    fi
  else
    which time >/dev/null 2>&1
    [ $? -gt 0 ] && "ERR: bcbench requires time(1)" 1>&2 && exit 1
    TIME=time
  fi
fi

for h in $TIME $BC
do
  [ "$h" = "time" ] && continue
  if [ ! -x $h -o ! -f $h ]; then
    echo "ERR: $h can not execute." 1>&2
    exit 1
  fi
done

#
# "-o" option: "posix" (= time(1) posix)
#              "normal" (= time(1) default)
#              "csv"
#              "tw" (for twitter(?))
#
# default is posix.
#
case "$OFORMAT" in
[Pp][Oo][Ss][Ii][Xx])
        OFORMAT="posix"
        timeopt="-p"
        ;;
[Cc][Ss][Vv])
        OFORMAT="csv"
        timeopt="-p"
        ;;
[Nn][Oo][Rr][Mm][Aa][Ll])
        OFORMAT="normal"
        timeopt=""
        ;;
[Tt][Ww])
        OFORMAT="tw"
        timeopt="-p"
        ;;
*)
        echo "ERR: $OFORMAT is unrecognized option. \"posix\",\"normal\",\"csv\" or \"tw\"." 2>&1
        exit 1
        ;;
esac

#
# "-c" option: "pi"
#              "e"
#              "both" (= "pi" and "e")
#
runbench()
{
  _arg=$1
  echo 'echo "scale='$SCALE'; '$_arg'" | '$TIME $timeopt $BC' -l 2>&1 >/dev/null'

  if [ "$OFORMAT" = "csv" ]; then
    # NetBSD, OpenBSD and Linux(GNU time 1.7) works fine. Other OS are untested. (Sorry..)
    echo "scale=$SCALE; $_arg" | $TIME $timeopt $BC -l 2>&1 >/dev/null \
    | sed -e 's/[ ]/:/' -e 's/[ ]*//g' \
    | tr '\n' ':' \
    | sed "s/\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):/$_arg,\1,\3,\5:\2,\4,\6:/" \
    | tr ':' '\n'
  elif [ "$OFORMAT" = "tw" ]; then
    echo "scale=$SCALE; $_arg" | $TIME $timeopt $BC -l 2>&1 >/dev/null \
    | sed -e 's/[ ]/:/' -e 's/[ ]*//g' \
    | tr '\n' ':' \
    | sed "s/\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):/$_arg:  \1 \2  \3 \4  \5 \6;/" \
    | tr ';' '\n'
    # echo "scale=$SCALE; $_arg" | $TIME $timeopt $BC -l 2>&1 >/dev/null | sed "s/^/$_arg: /"
  else
    echo "scale=$SCALE; $_arg" | $TIME $timeopt $BC -l 2>&1 >/dev/null
  fi
}

case "$CALC" in
[Bb][Oo][Tt][Hh])
        #CALC="both"
        runbench 'e(1)'
        runbench '4*a(1)'
        ;;
[Ee])
        #CALC="e"
        runbench 'e(1)'
        ;;
[Pp][Ii])
        #CALC="pi"
        runbench '4*a(1)'
        ;;
*)
        echo "ERR: $h is unrecognized option. \"pi\" or \"e\"." 2>&1
        exit 1
        ;;
esac

 ダウンロード

シェルスクリプト

bcbench.sh

MD5 (bcbench.sh) = 36ff66a25638d49046fb41f42574653c

NetBSDのバイナリーパッケージ

bcbench-20120112.tgz

MD5 (bcbench-20120112.tgz) = f13c0ffd1ea5d7fabab176e55f38968a

※i386以外の人は、pkg_add -f /path/to/bcbench-20120112.tgzと、-fオプションを使いましょう。

最後に

これを思いついた、おおしまさん、ありがとうございます。

あと、このページをつくるきっかけとモチベーションをくれたNBUGK*BUGのみなさまにも感謝。

英語版のページのあまりにひどい英文の修正案をくれた、おおしまさんと中治さん、ありがとうございます。

間違いの指摘や、ご意見などは、FrontPageにある連絡先にメールを下さるとうれしいです。

最終更新時間:2017年02月09日 07時28分00秒