カメニッキ

カメとインコと釣りの人です

シェルスクリプトで巨大な文字列とのマッチング処理をするとき、変数格納よりもファイル参照したほうが速かった

この前必要があってお粗末なスクリプトを書いた時、速度に大きな差があったので気になった。

なんとなく変数に持ったほうが、試行回数が増えるほど早くなるのかとおもってた

宣伝

tapira.hatenablog.com

今回の環境

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

使用するファイル

# ファイルに対して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  123 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]

あれ?これって当たり前の話??? もしかして恥ずかしい疑問なのかもしれない