一个比ack速度快n倍的代码搜索工具: ag
一个比ack速度快n倍的代码搜索工具: ag
银搜索者(The Silver Searcher)
一个类似于代码搜索工具ack
,着重于速度。
Github: https://github.com/ggreer/the_silver_searcher
Ag有什么好处?
- 它比一个数量级快
ack
。 - 它忽略了你
.gitignore
和你的文件模式.hgignore
。 - 如果您的源代码中有文件您不想搜索,只需将其模式添加到
.ignore
文件中即可。(*咳嗽**.min.js
*咳嗽*) - 命令名称比起第33行短
ack
,所有的键都在主排上!
Ag现在相当稳定 大多数更改是新功能,小错误修复或性能改进。比我的基准要快得多:
ack test_blah ~/code/ 104.66s user 4.82s system 99% cpu 1:50.03 total
ag test_blah ~/code/ 4.67s user 4.58s system 286% cpu 3.227 total
Ack和Ag发现了相同的结果,但是Ag的速度是34倍(3.2秒vs 110秒)。我的~/code
目录是大约8GB。感谢git / hg / ignore,Ag只搜索了700MB。
还有各版本的性能图表。
怎么这么快?
- Ag使用Pthreads并行利用多个CPU内核和搜索文件。
- 文件被
mmap()
编辑而不是读入缓冲区。 - 文字字符串搜索使用Boyer-Moore strstr。
- 正则表达式搜索使用PCRE的JIT编译器(如果Ag使用PCRE> = 8.21构建)。
-
pcre_study()
在每个文件执行相同的正则表达式之前,Ag调用它。 - 而不是调用
fnmatch()
忽略文件中的每个模式,非正则表达式模式将加载到数组中并进行二进制搜索。
我写了几篇博客文章,显示了我如何改进性能。这些包括我如何添加pthreads,写我自己的scandir()
,基准测试每个版本以找到性能回归,并用gprof和Valgrind进行分析。
安装
MACOS
brew install the_silver_searcher
要么
port install the_silver_searcher
Linux的
- Ubuntu> = 13.10(Saucy)或Debian> = 8(Jessie) apt-get install silversearcher-ag
- Fedora 21及以下 yum install the_silver_searcher
- Fedora 22+ dnf install the_silver_searcher
- RHEL7 + yum install epel-release.noarch the_silver_searcher
- Gentoo的 emerge the_silver_searcher
- 拱 pacman -S the_silver_searcher
- Slackware的 sbopkg -i the_silver_searcher
- openSUSE的: zypper install the_silver_searcher
- CentOS的: yum install the_silver_searcher
- SUSE Linux Enterprise:按照这些简单说明进行操作。
BSD
- FreeBSD的 pkg install the_silver_searcher
- OpenBSD系统/ NetBSD的 pkg_add the_silver_searcher
Cygwin的
运行相关的setup-*.exe
,并在“Utils”类别中选择“the_silver_searcher”。
从源头建造
建筑大师
- 安装依赖关系(Automake,pkg-config,PCRE,LZMA):
- MacOS的: brew install automake pkg-config pcre xz 要么 port install automake pkgconfig pcre xz
- Ubuntu的/ Debian的: apt-get install -y automake pkg-config libpcre3-dev zlib1g-dev liblzma-dev
- Fedora的: yum -y install pkgconfig automake gcc zlib-devel pcre-devel xz-devel
- CentOS的: yum -y groupinstall "Development Tools" yum -y install pcre-devel xz-devel
- openSUSE的: zypper source-install --build-deps-only the_silver_searcher
- Windows:这很复杂 看到这个维基页面。
- 运行构建脚本(它运行aclocal,automake等): ./build.sh
在Windows上(在msys / MinGW shell内):
make -f Makefile.w32
- 安装: sudo make install
建立释放tarball
GPG签名的版本可在这里。
构建版本tarball需要相同的依赖关系,除了automake和pkg-config。安装依赖项后,只需运行:
./configure
make
make install
您可能需要以sudo
root身份使用或运行make install。
编辑器集成
VIM
您可以使用Ag与[ack.vim] []添加以下行到您的.vimrc
:
let g:ackprg = 'ag --nogroup --nocolor --column'
要么:
let g:ackprg = 'ag --vimgrep'
哪个有同样的效果,但会报告每一场比赛。
Emacs的
您可以使用ag.el作为Ag的Emacs前端。参见:helm-ag。
TextMate的
TextMate用户可以使用Ag与我流行的AckMate插件的分支,这可以让您同时使用Ack和Ag进行搜索。如果您已经有AckMate,您只需要用Ag替换Ack,移动或删除"~/Library/Application Support/TextMate/PlugIns/AckMate.tmplugin/Contents/Resources/ackmate_ack"
并运行ln -s /usr/local/bin/ag "~/Library/Application Support/TextMate/PlugIns/AckMate.tmplugin/Contents/Resources/ackmate_ack"
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP crypt()函数的用法讲解
- Python如何自动获取目标网站最新通知
- PHP+mysql实现的三级联动菜单功能示例
- Python调用shell cmd方法代码示例解析
- 实例讲解PHP表单处理
- 用python实现名片管理系统
- keras 简单 lstm实例(基于one-hot编码)
- keras用auc做metrics以及早停实例
- Laravel中错误与异常处理的用法示例
- Laravel用户授权系统的使用方法示例
- Yii2结合Workerman的websocket示例详解
- Python使用文件操作实现一个XX信息管理系统的示例
- PHP htmlspecialchars() 函数实例代码及用法大全
- 浅谈keras2 predict和fit_generator的坑
- 使用python实现名片管理系统