Glide Note

glidenote's blog

ackを捨てて、より高速なag(The Silver Searcher)に切り替えた

パターン検索にはackを利用していて、通常利用時には特に不満は無かったんですが、 ファイル数が多いディレクトリだと遅かったので、もっと他の方法が無いかと調べていたら ackの3〜5倍速いというThe Silver Searcherというものが あったので導入。

The Silver Searcherの特徴

公式に書いてあるThe Silver Searcherの特徴

  • ackの3〜5倍高速
  • .gitignore.hgignoreに記載されているものを検索対象から除外
  • 検索対象から除外したいファイルは.agignoreに記載
  • agというコマンド名で、ackと比べてコマンドが短い(33%減!)

なぜ高速なのかは https://github.com/ggreer/the_silver_searcher#how-is-it-so-fast に記載されています。(要約しにくいので、原文を読んでください!)

The Silver Searcherの導入

Macの場合はhomebrewで導入

1
brew install the_silver_searcher

2013/10/31 最近は下記でいけると新卒氏に教えてもらったので追記

1
brew install ag

CentOS6、SL6はRPMが用意されているので、下記を利用

1
2
sudo rpm -ivh http://swiftsignal.com/packages/centos/6/x86_64/the-silver-searcher-0.13.1-1.el6.x86_64.rpm --test
sudo rpm -ivh http://swiftsignal.com/packages/centos/6/x86_64/the-silver-searcher-0.13.1-1.el6.x86_64.rpm

ソースから導入する場合(コンパイルにautomakeとかpcre-develが必要だと思いますので適時入れてください)

1
2
git clone https://github.com/ggreer/the_silver_searcher
cd the_silver_searcher && ./build.sh && install

RHEL6系以外での利用も、specファイルが含まれているのでRPM作成も簡単に出来た。

The Silver Searcherの利用方法

The Silver Searcherはagというコマンドを用い、

1
ag [options] {pattern} [{directory}]

という感じで利用し、ほぼackと同じ。

実際に私の環境(MacBook Air)で、ackagで実行時間を計測した結果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ファイル数
[[email protected]] $ find ~/repos -type f | wc -l
    3518

# ディレクトリ容量
[[email protected]] $ du -sh ~/repos
894M    .

# ackの実行時間
[[email protected]] $ time ack package ~/repos |wc -l
    1475
    ack package ~/repos  0.84s user 0.26s system 81% cpu 1.341 total

# agの実行時間
[[email protected]] $ time ag package ~/repos |wc -l
    1668
    ag package ~/repos  0.23s user 0.18s system 172% cpu 0.235 total

3500個くらいのファイル検索でもackと比べて、agが高速なのがわかる。 多分ファイル数がディレクトリだとさらに効果がありそう。

実際にいろいろなディレクトリで何回か検索を実行してみても、agの方が高速でした。

VimからThe Silver Searcherを利用する

ackと同じで、Vimから使うことが多いと思うので、Vimから使えるようにする。 ag.vimというプラグインがあるので、それを利用。

Vundleを利用している場合は.vimrcに下記を記載してBundleInstall

1
Bundle 'rking/ag.vim'

NeoBundleの場合は下記を記載してNeoBundleInstall

1
NeoBundle 'rking/ag.vim'

Vim上から下記のような形で利用

1
:Ag [options] {pattern} [{directory}]

Vim上からも高速にパターン検索が出来るようになって素晴らしい。

ZshからのThe Silver Searcherを利用する

当然zshの補完が効かないと話にならないので、zshの補完関数を書いた。

下記のように補完されます。

追記

zsh-completionsに出していたpull requestがmergeされたので、zsh-completionsからでも利用可能です。

ackと比較して動作もかなり高速だし、vim、zshから快適に使えるようになったので完全に切り替え。

Comments