grepの一部機能をGo言語で実装してみた
サービスの運用業務でgrepコマンドはよく使うのですが、
前回実行してから行数が増えたので差分だけgrepしたい
という要件とかもあります。
gogrep "検索文字列" "検索ファイル"
gogrep "検索文字列" "検索ファイル" "検索開始行"
という機能だけとりあえず実装してました。
GitHub - bose999/GoGrep: GoGrep has the function of the part of Grep.
上記に置いてあります。
という事で開発したMac Book Pro Retina 15
(Marvericks/Corei7/Mem 16GB/SSD 512GB)上で
OSのgrepとgoGrepの性能をざっとくらべてみます。
まず検索対象のテキストファイルを1GBくらいで生成
% cat makeRandomText.sh #!/bin/bash for i in `seq 1 1048576` do pwgen -0A 1024 1 >> /Users/matakeda/Documents/a.txt done % ls -lah /Users/matakeda/Documents/a.txt -rw-r--r-- 1 matakeda staff 1.0G 12 29 18:15 /Users/matakeda/Documents/a.txt
次に実行した時間を秒で表示して処理結果をdiffするシェルを3回実行
% cat grep-time.sh #!/bin/bash echo "GoGrep & Grep 実行" GG_START=`date +'%s'` /Users/matakeda/Documents/git/GoGrep/bin/gogrep "doshuc" /Users/matakeda/Documents/a.txt > ./gogrep.out GG_END=`date +'%s'` G_START=`date +'%s'` /usr/bin/grep "doshuc" /Users/matakeda/Documents/a.txt > ./grep.out G_END=`date +'%s'` echo "GoGrep" echo `expr $GG_END - $GG_START` echo "grep" echo `expr $G_END - $G_START` echo "diff" echo `diff ./gogrep.out ./grep.out` echo "finish"
% ./grep-time.sh GoGrep & Grep 実行 GoGrep 3 grep 14 diff finish % ./grep-time.sh GoGrep & Grep 実行 GoGrep 3 grep 15 diff finish % ./grep-time.sh GoGrep & Grep 実行 GoGrep 3 grep 15 diff finish
grepが約14秒〜15秒、gogrepが約3秒という結果になりました。
ランダムアクセスとか使わないで先頭からのテキストファイルの
行ループを使って並列処理をガンガン書いたわけでも無いのに
思ってたよりも処理早いですね。。。w
これ業務で休み明け使いますわ。