シェルスクリプトで巨大な文字列とのマッチング処理をするとき、変数格納よりもファイル参照したほうが速かった
この前必要があってお粗末なスクリプトを書いた時、速度に大きな差があったので気になった。
なんとなく変数に持ったほうが、試行回数が増えるほど早くなるのかとおもってた
宣伝
今回の環境
KagoyaVPS 最小構成CentOS6.5 日毎課金なので特にこだわりなければ安くあがっておすすめです。ちょっと触ってすぐ削除するような使い方
[root@v8794 work]# cat /proc/cpuinfo | grep processor processor : 0 processor : 1 processor : 2 [root@v8794 work]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@v8794 work]# free total used free shared buffers cached Mem: 2097152 445288 1651864 0 0 424992 -/+ buffers/cache: 20296 2076856 Swap: 4194304 21420 417288
使用するファイル
- 巨大テキスト 以下で取得したデータを変換して作成 私立PDD図書館/百科辞書
# ファイルに対してgrep [root@v8794 work]# cat file.sh #! /bin/sh cat << EOF | while read txt `cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n $2 | sort | uniq` EOF do grep ${txt} $1 if [ $? -eq 0 ]; then echo "true" else echo "false" fi done # 変数に格納したあとgrep [root@v8794 work]# cat val.sh #! /bin/sh testtxt=`cat $1` cat << EOF | while read txt `cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n $2 | sort | uniq` EOF do echo $testtxt | grep ${txt} if [ $? -eq 0 ]; then echo "true" else echo "false" fi done
ファイル観たほうが速い
[root@v8794 work]# time ./file.sh test.txt 10 false false false false false false false false false false real 0m0.179s user 0m0.087s sys 0m0.085s [root@v8794 work]# time ./val.sh test.txt 10 false false false false false false false false false false real 0m51.921s user 0m45.767s sys 0m7.232s
ちなみに、小さいファイルにしたら逆転するのかと思ったら、そんなことなかった
[root@v8794 work]# ll test2.txt -rw-r--r-- 1 root root 17000 1月 23 20:48 2016 test2.txt [root@v8794 work]# time ./file.sh test2.txt 10 false false false false false false false false false false real 0m0.019s user 0m0.002s sys 0m0.007s [root@v8794 work]# time ./val.sh test2.txt 10 false false false false false false false false false false real 0m0.049s user 0m0.032s sys 0m0.008s [root@v8794 work]
あれ?これって当たり前の話??? もしかして恥ずかしい疑問なのかもしれない