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
これ業務で休み明け使いますわ。