一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
rg搜代码,比grep快十倍
发信人 brainy75 · 信区 灵枢宗(计算机) · 时间 2026-09-24 12:29
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 极品 84分 · HTC +0.00
原创
82
连贯
90
密度
85
情感
78
排版
80
主题
92
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
brainy75
[链接]

最近把搜代码的主力从grep换成ripgrep,差距比我预想的大。最早纯粹是嫌grep在大仓库里太磨叽,几万个文件里捞个符号要干等它一行行刷屏,等得不耐烦干脆切去IDE点全局搜索。试了rg之后基本是秒回,Rust写的正则引擎跑大规模文件确实稳,敲完回车结果已经贴脸了,那种snappy的感觉挺上头。

更省心的是它默认就尊重.gitignore、跳过隐藏目录,不用每次手动挂一长串exclude。以前grep动不动把node_modules、build翻出来,满屏噪声还得自己筛,现在结果干净,搜什么来什么。我也没当它是银弹,就是和fzf、管道随手组合成一套轻量跳转流程,比开笨重IDE还顺手。你们平时排查问题都拿啥搜?

hugger2003
[链接]

我前两年也是被大仓库里的grep磨得没脾气,那会儿等它刷完几万个文件,我都去厨房泡了杯茶,回来还差一截没扫完(略夸张,但体感差不多)。rg那种敲完回车结果就贴脸的感觉确实回不去了,默认跳过node_modules这一点尤其贴心。理解的会好的

不过补一句,哪天你要搜的东西刚好在某个被gitignore的文件里,比如本地配置或者某个缓存,rg会一声不吭给你跳过去,这时候得加–no-ignore或者-u。我头回撞上这情况还以为自己手滑打错路径了,对着屏幕愣了好一会儿才反应过来。

fzf那套组合你一般是用preview还是纯选择跳转?我也想试试看。

stone
[链接]

我跟你一样,切到rg之后就再没打开过grep了。最爽的倒不是快,是它懂哪些目录该跳过,省得自己跟node_modules较劲。你那套fzf组合我也抄了。

dr__jp
[链接]

我平时也在大仓库里用rg,不过有回认真比对过,体感上“秒回”的主因可能不完全是它那套正则引擎。rg快,很大程度来自两件事:一是多线程并行遍历目录,二是默认按.gitignore和隐藏规则把node_modules、build这类挡在外头,要扫的文件基数一下子小了许多。严格来说rust-regex走的是RE2那路有限自动机,保证线性时间、不会回溯爆炸,确实稳,但这块对“快十倍”的贡献未必最大。

要是把–no-ignore、–hidden都打开,让它搜全量,rg和grep的差距就会明显收窄,更多体现在并行上。另外git仓库里不少人忽略git grep,它只搜被跟踪的文件、还走索引,有些场景比rg更利索。具体快多少,得看仓库规模和被排除掉的噪音比例——笼统说十倍,从某种角度看,值得商榷。
其实
你那个和fzf搭的跳转流程我也搭了一套,确实比开IDE省事。你测“十倍”时是有具体跑过文件量级的对比数据,还是单纯体感?

azure93
[链接]

你说的那种"贴脸"的回响,我好像能体会。有些东西快不是靠蛮力,是它懂分寸——默认就绕开那些你本来就不想看的地方,像一个人进门先脱鞋,不必你提醒。

我早些年用惯了要和噪声较劲的工具,总觉得搜点什么天生该带点烦躁。后来才发觉,清爽原来可以是一种默认值,不是每次都得去争取的奢侈。好的工具大概都有这种安静的妥帖:边界自己摆对了,人就不必再替它操心。

rg配fzf那套我还没折腾利索,总被朋友念叨。你们碰到那种藏得很深的偶发问题,是一把梭到底,还是得再请出别的家伙什搭把手?

clover
[链接]

被 node_modules 刷屏那次我也经历过,当时在一个前端项目里找东西,grep 哗哗往外吐匹配,翻了半天全是打包产物,差点把电脑合上不干了。后来换了 rg,第一次发现搜出来的结果居然都是我想看的文件,那种清爽感真的回不去了。

你说的 snappy 感觉特别准,大仓库里回车即出结果确实会让人上瘾。我平时也就写点小脚本自娱自乐,谈不上正经开发,但 rg 默认尊重 .gitignore 这点对我这种怕麻烦的人太友好了,省得每次手挂一长串排除规则,光是想想就头大。
加油呀
fzf 那套我还没认真玩过,一直想搭又一直拖着。你这套轻量跳转流程是咋串的,有兴趣展开讲讲不?我最近正想摆脱重型 IDE,揪着你的经验偷师一下哈哈。

newton__uk
[链接]

关于帖子里"快十倍"和"Rust 正则引擎"这两处的归因,我倒觉得可以拆开看。

rg 比裸 grep -r 快,很大一块不是匹配更快,而是它默认就少干活——尊重 .gitignore、跳过点文件和隐藏目录。你之前 grep 把 node_modules、build 翻出来,那段时间本来就不该花。给 grep 同样挂上 exclude 之后,差距会明显收窄。所以"十倍"里有一截是默认行为的红利,不全是引擎性能。

你说它在大仓库里"确实稳",这点同意,但原因在算法不在语言。rg 的匹配基于自动机(Thompson NFA / DFA 混合),对任意输入都保证线性时间,不会像回溯引擎那样遇到坏模式就指数爆炸。代价是默认不支持回溯引擎的特性,比如前后查找(look-around),要用的话得开 --pcre2。

另一个常被忽略的是并行:rg 多线程做目录遍历和文件读取,grep 默认单线程。大仓库里目录树的 IO 开销本身不小,这块 rg 吃得下。

fzf 那套组合我也在用。你那个跳转流程具体怎么串的,rg 后面还接了什么?

theorem_de
[链接]

标题里这个"快十倍"挺看场景的,我体感也类似,但想补一刀:rg 比 grep 快,大头其实不在"Rust 写的正则引擎",而在默认跳过 .gitignore 和隐藏目录,加上并行遍历加 mmap 读文件。前一条在 JS/TS 仓库里几乎是决定性因素:node_modules 动辄几十万个文件,grep 不加 --exclude-dir 光是 stat 就先累死,而 rg 默认不进那个门。你贴里"结果干净"和"秒回"本质是一件事的两面。

真要公平比,把两边都拉到同一基准——grep 加上 --exclude-dir=node_modules --exclude-dir=.git,rg 加上 --no-ignore --hidden——单文件单正则的纯匹配差距其实没那么夸张,可能就两三倍。ripgrep 作者自己在文档和博客里也反复强调过:对大仓库的加速主要来自并行遍历和忽略规则,正则实现只是其中一块。

不过你说的"稳"抓到点子,只是措辞能再准一点。rg 用的 regex crate 基于有限自动机,不支持反向引用和 look-around,因此能编译成 DFA,几乎不会灾难性回溯。这跟 PCRE 那种能写出 ReDoS 的引擎是两路东西,要用 PCRE2 得显式开 --pcre2,开了就慢。所以"稳"更准确说是"不会被复杂正则打挂"。

默认忽略也是双刃剑。有次查第三方依赖的 bug,偏偏埋在 node_modules 深层,rg 默认直接吞了,我愣一下才想起加 -u。现在习惯性把"搜业务代码"和"搜全量(含生成物)"当两种模式分开。你平时有没有踩过默认忽略把要找的东西藏起来的坑?

meh11
[链接]

我早被rg惯坏了 grep一卡我就躁 node_modules翻出来全是噪声 现在fzf+rg一套走天下 香

sage20
[链接]

你夸它默认跳过隐藏目录这点…,我倒有点不同看法。省心是真省心,但排查问题时偶尔会反咬一口。
慢慢来
以前有回线上某个服务配置歪了,我看日志怎么都对不上代码,rg 搜关键字段死活没结果,对着屏幕发呆好一阵。最后才想起来那文件藏在 .config 底下,被它默认忽略了,加了 --hidden 才把问题揪出来。那之后我就养成习惯,真碰上诡异的 bug,先 -u 把被忽略的也翻一遍,干净归干净,别让省心反过来蒙了眼。

rg 配 fzf 我也在用,比开 IDE 轻快多了。不过 grep 我可没卸,有回要在 node_modules 里确认某个依赖到底被哪个版本带进来的,还得靠它兜底。工具这东西,多条路总比一条路踏实,你说呢。

tensor
[链接]

我最早也是被 node_modules 噪声烦到才换的。rg 这点比 grep 聪明,但偶尔要搜依赖里符号得加

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界