weblog of key_amb

主にIT関連の技術メモ

Bash で pathctl という PATH 操作ツールと bb という簡易ベンチマークツールを書いた

小さな Bashスクリプトを2つ書いたという小ネタです。

使い方

1. pathctl

環境変数に対する push, pop, shift, unshift 操作を提供します。

#!bash
source pathctl.shrc
pathctl_push    /path/to/your-bin  # 末尾に追加
pathctl_unshift /path/to/your-bin  # 先頭に追加
pathctl_pop                        # 末尾から除く
pathctl_shift                      # 先頭から除く

2. bb

簡易ベンチマーク
time コマンドを付けて引数で与えられたコマンドを一定回数実行して結果を出力するだけ。

## 例
$ bb.bash true "test -f bb.bash && echo true" "cat README.md"
Exec 'true' 1000 times ...
real    0m0.037s
user    0m0.016s
sys     0m0.019s
Exec 'test -f bb.bash && echo true' 1000 times ...
real    0m0.044s
user    0m0.023s
sys     0m0.019s
Exec 'cat README.md' 1000 times ...
real    0m1.972s
user    0m0.820s
sys     0m1.111s

source bb.bash すると bb という関数が読み込まれるので、この関数を使っても同じことができます。
回数を変えたいときは loop=$N bb ... で($N は数字)。

pathctl の高速化について

pathctl を作ったきっかけは Qiita に書いたこちらの記事の状況でした。

これを最初に書いた直後に @sonots さんからコメント頂き、「RedHat 系 OS だったら pathmunge という関数があるよ」と知りました。

コードを見てみたところ、 pathctl よりもシンプルで速そうだったので、この方式に修正してみることにしました。

実際どのくらい違うのか測ってみるついでに bb を作った、という経緯です。

結果は こちらのイシュー に書いていますが、下にコピペします。

# pathmunge x 1000
Exec '. tmp/pathmunge.bash && pathmunge foo' 1000 times ...
real    0m0.138s
user    0m0.102s
sys     0m0.031s
# pathctl x 1000 高速化前
Exec '. pathctl.bash && pathctl_push foo' 1000 times ...
real    0m5.024s
user    0m2.249s
sys     0m3.061s
# pathctl x 1000 高速化後
Exec '. pathctl.bash && pathctl_push foo' 1000 times ...
real    0m0.921s
user    0m0.498s
sys     0m0.311s

元々 pathmunge の1/40ぐらいのスループットだったのが、1/7ぐらいまでにはなった、というところです。

機会がありましたら、ご自由にご利用ください。