App-Greple
view release on metacpan or search on metacpan
RIPGREP-STUDY.md view on Meta::CPAN
# greple é«é忤è¨è³æ â ripgrep ã®åãè¾¼ã¿ãä¸å¿ã«
- 使æ¥: 2026-07-02
- 対象: App-Greple 10.04 (master 6625a99)
- è¨æ¸¬ç°å¢: macOS 15 (Darwin 24.6) / Apple Silicon / perl 5.42.2 / ripgrep 15.1.0 (+pcre2, NEON SIMD)
## 1. è¦æ¨
ripgrep ã®é«éæ§ã greple ã«åãè¾¼ãæ¹æ³ã¨ãã¦ã以ä¸ã® 5 æ¡ãæ¤è¨ããã
| æ¡ | æ¦è¦ | 广 | å·¥æ° | å¤å® |
|----|------|------|------|------|
| A | rg ããã¡ã¤ã«ã¬ãã«ã®ããªãã£ã«ã¿ã«ä½¿ã | 大ï¼å¤ãã¡ã¤ã«æ¤ç´¢ï¼ | å° | **æ¨å¥¨** |
| B | rg --json ã®ä½ç½®æ
å ±ã greple å
é¨ä½ç½®ã«å¤æ | ã»ã¼ç¡ããé广 | ä¸ | 鿍奍 |
| C | Rust ã©ã¤ãã©ãª (grep crates) ã FFI ã§å¼ã¶ | å° | 大 | 鿍奍 |
| D | greple å
¨ä½ã Rust ã§æ¸ãç´ã | 大 | ç¹å¤§ | 鿍奍ï¼å¥ããã¸ã§ã¯ããªãå¯ï¼ |
| E | Perl å
é¨ã®æ¹åï¼ä¸¦ååã»ãããå¾å¦çæé©åï¼ | ä¸ | å°ãä¸ | **ä½µç¨æ¨å¥¨** |
çµè«ãå
ã«è¿°ã¹ãã¨ã**宿¸¬ã®çµæãgreple ã®é
ãã®ä¸»å ã¯æ£è¦è¡¨ç¾ã¹ãã£ã³ã§ã¯ãªã**ã
ããã«ããã¯ã¯ (1) ãããå¾ã® Perl ãã¼ã¿æ§é å¦çã(2) ãã¡ã¤ã«ãã¨ã®é次å¦çãªã¼ãã¼ãããã(3) ä¸¦åæ§ã®æ¬ å¦ã§ããã
ãripgrep ã«æ£è¦è¡¨ç¾ããããè©ä»£ããããã¦ä½ç½®æ
å ±ãããããæ¹å¼ï¼æ¡ B/Cï¼ã¯ã
é«éåãããé¨åãããããæ¯é
çã³ã¹ãã§ãªããã广ãåºãªãã
ã¦ã¼ã¶ã¼ã以å試ãã¦ããã¾ã使ããªãã£ããã®ã¯ä½ç½®è¡¨ç¾ã®éäºæã ãã§ãªãããã®æ§é çãªçç±ã«ããã
䏿¹ã**ããããããªããã¡ã¤ã«ã« greple ã®å¦çãä¸åèµ°ãããªããããªãã£ã«ã¿æ¹å¼ï¼æ¡ Aï¼ã¯ã
rg ã®ä¸¦åèµ°æ»ã»ãã¡ã¤ã«ã¹ãããã®å¼·ã¿ããã®ã¾ã¾äº«åã§ããä½ç½®å¤æãä¸è¦**ã
宿¸¬ã§ãå¤§è¦æ¨¡ããªã¼æ¤ç´¢ã§ 5 å以ä¸ï¼ããªã¼ã大ããããããçãªã»ã©æ¡å¤§ï¼ã®æ¹åã確èªããã
## 2. ç¾ç¶åæ: greple ã®ã¢ã¼ããã¯ãã£
ãµãã¨ã¼ã¸ã§ã³ãã«ããã³ã¼ã調æ»çµæã®è¦ç¹ï¼file:line ã¯ç¾ master åºæºï¼ã
### 2.1 å¦çã¢ãã«
- **slurp æ¹å¼**: ãã¡ã¤ã«å
¨ä½ã 1 ã¹ã«ã©æååã¨ãã¦èªãï¼`script/greple:989-1023`ï¼ã
è¡åä½ã¹ããªã¼ãã³ã°ã§ã¯ãªãã
- **æååä½ãªãã»ãã**: å
¥å㯠`binmode STDIN, ":encoding($file_code)"`ï¼`script/greple:1226`ï¼ã§
èªã¿è¾¼ã¿æã«ãã³ã¼ãããã以å¾ã®æ¤ç´¢ã»é åæ¼ç®ã¯ãã¹ã¦ **Perl å
鍿ååä¸ã®æåãªãã»ãã**ã§è¡ãããã
`Regions.pm` ã® `match_regions`ï¼`lib/App/Greple/Regions.pm:97-117`ï¼ã¯
`pos() - length(${^MATCH})` ã§ `[from, to]` ãç®åºããã
- **é å代æ°**: `--inside/--outside/--include/--exclude`ããããã¯æ§ç¯ãmust/need/allow å¤å®ã¯
ãã¹ã¦ `[from, to]` ãã¢é
åã«å¯¾ããéåæ¼ç®ï¼`Regions.pm`, `Grep.pm`ï¼ã
- **Perl æ£è¦è¡¨ç¾ã¸ã®ä¾å**: `/p` + `${^MATCH}`ã`pos()`ã`\G` + `\X`ï¼`Pattern.pm:134`ï¼ã
å¯å¤é·å¾èªã¿ãã¦ã¼ã¶ã¼ãã¿ã¼ã³ã® Perl æ¹è¨å
¨è¬ã
- **ã¢ã¸ã¥ã¼ã«çµåç¹**: `--inside '&func'` çã®é¢æ°ãã¿ã¼ã³ã¯ `$_` ã«ãã¡ã¤ã«å
容ãå
¥ã£ãç¶æ
ã§
å¼ã°ãã`[from, to]` ã®é åãªã¹ããè¿ãï¼`Grep.pm:444-457`ï¼ã`--begin/--end/--postgrep/--print`
ãåæ§ã« Perl ã³ã¼ããæ¤ç´¢ãã¤ãã©ã¤ã³ã¸ç´æ¥ä»å
¥ããã
- **鿬¡å¦ç**: ãã¡ã¤ã«ã«ã¼ãï¼`script/greple:1119-1162`ï¼ã¯åä¸ããã»ã¹ã»åä¸ã¹ã¬ããã
並åå¦çã¯ä¸åãªãï¼fork 㯠find.pm ã®å¤é¨ã³ãã³ãèµ·å㨠PGP 復å·ã®ã¿ï¼ã
- **å
¥åãã£ã«ã¿**: `--if` ã¯å¤é¨ã³ãã³ãã®åºåã STDIN çµç±ã§æ¤ç´¢å¯¾è±¡ã«ããï¼`Filter.pm:87-111`ï¼ã
æ¤ç´¢å¯¾è±¡ãå
ãã¡ã¤ã«ã®ãã¤ãåã¨ä¸è´ããªãå ´åãããç¹ã¯ãå¤é¨ã¨ã³ã¸ã³çµ±åæã®å¶ç´ã«ãªãã
### 2.2 ãã³ããã¼ã¯
ã³ã¼ãã¹: UTF-8 æ¥è±æ··å¨ããã¹ã 26MB / 30 ä¸è¡ï¼ããã³åå
容ã 100 è¡ Ã 3000 ãã¡ã¤ã«ã«åå²ããããªã¼ï¼ã
warm cacheã3 åè¨æ¸¬ã®ä»£è¡¨å¤ã
**åä¸ãã¡ã¤ã«ï¼26MBï¼**
| ã³ãã³ã | ãããè¡æ° | æé |
|---|---:|---:|
| `rg -c fox` | 95,984 | 0.010s |
| `grep -c fox` | 95,984 | 0.009s |
| `perl -ne '$c++ if /fox/'`ï¼UTF-8 ãã³ã¼ãè¾¼ã¿ï¼ | 95,984 | 0.035s |
| `greple -c fox` | 95,984 | **0.82s** |
| `greple -c é«é` | 115,860 | **0.96s** |
| `greple -c <ããã0ä»¶>` | 0 | **0.12s** |
| `greple`ï¼/dev/nullãèµ·åã³ã¹ãã®ã¿ï¼ | â | 0.044s |
**å¤ãã¡ã¤ã«ï¼3000 ãã¡ã¤ã« / è¨ 26MBï¼**
| ã³ãã³ã | æé |
|---|---:|
| `rg -c <ããã0ä»¶> tree/`ï¼ä¸¦åï¼ | 0.034s |
| `rg -j1 -c <ããã0ä»¶> tree/`ï¼åä¸ã¹ã¬ããï¼ | 0.036s |
| `rg -l é«é tree/`ï¼å
¨ãã¡ã¤ã«ãããï¼ | 0.047s |
| `greple -Mdig -c <ããã0ä»¶> --dig tree` | **0.88s** |
| `greple -Mdig -c é«é --dig tree` | **1.6s** |
**ããªãã£ã«ã¿å¹æï¼3000 ãã¡ã¤ã«ä¸ 5 ãã¡ã¤ã«ã®ã¿ã«ãããããå¸å°ãã¿ã¼ã³ï¼**
| ã³ãã³ã | æé |
|---|---:|
| `greple -Mdig -l zebra --dig tree` | 0.30s |
| `rg -l zebra tree/ \| greple --readlist -l zebra` | **0.058s** |
### 2.3 ããã«ããã¯ã®åè§£
ä¸ã®æ°å¤ãã greple ã® 1 å®è¡ãããã®ã³ã¹ãå
訳ãåè§£ã§ããã
| ãã§ã¼ãº | 宿¸¬å¤ | åè |
|---|---|---|
| èµ·åï¼ã¢ã¸ã¥ã¼ã«ãã¼ãã»ãªãã·ã§ã³å¦çï¼ | 44ms | Getopt::EX çãã©ã®æ¹å¼ã§ãæ®ãä¸é |
| ãã³ã¼ã + æ£è¦è¡¨ç¾ã¹ãã£ã³ | ç´ 80ms / 26MB | ããã 0 ä»¶æ 0.124s â èµ·å 44ms |
| **ãããå¾å¦ç**ï¼Match/Block æ§ç¯ã»é åæ¼ç®ã»ã«ã¦ã³ãï¼ | **ç´ 7µs / ããã** | 10 ä¸ãããã§ 0.7ã0.9sã**æ¯é
çã³ã¹ã** |
| ãã¡ã¤ã«ãã¨ã®ãªã¼ãã¼ããã | ç´ 0.25ms / ãã¡ã¤ã« | openã»binmodeã»slurp ç |
**嫿**: rg ã 26MB ã 10ms ã§èµ°æ»ããã®ã«å¯¾ã greple ã®ã¹ãã£ã³ãã§ã¼ãºã¯ 80ms â 差㯠8 åã ã
絶対å¤ã¯å°ãããããããå¤ãå ´åã® 0.8ã1.0s ã®å¤§åã¯ã¹ãã£ã³ã§ã¯ãªã
**ãããå¾ã® Perl å´å¦ç**ã§ãããããã¯åæãããåæãå¤é¨åãã¦ãæ¶ããªãã
ã¤ã¾ããrg ã«ä½ç½®ãåºããããæ¹å¼ã®çè«ä¸ã®æ¹åä¸éã¯ããã®ã¯ã¼ã¯ãã¼ãã§ã¯ 1 å²ç¨åº¦ãããªãã
## 3. ripgrep å´ã®äºå®ç¢ºèª
### 3.1 `--json` åºåï¼å®æ¸¬ç¢ºèªæ¸ã¿ï¼
```json
{"type":"match","data":{"path":{"text":"sample.txt"},
"lines":{"text":"foo é«é bar\n"},"line_number":1,"absolute_offset":0,
"submatches":[{"match":{"text":"é«é"},"start":4,"end":10}]}}
```
- `absolute_offset` ã¯è¡é ã®çµ¶å¯¾ãã¤ããªãã»ããã`submatches` ã® `start/end` ã¯è¡å
ãã¤ããªãã»ããã
- **ãã©ã³ã¹ã³ã¼ãæï¼`-E euc-jp` ã BOM æ¤åºæï¼ã®ãªãã»ããã¯ãå¤æå¾ UTF-8 ãã¤ãååºæº**
ï¼EUC-JP ãã¡ã¤ã«ã§å®æ¸¬ç¢ºèª: `é«é` â start:4, end:10 = UTF-8 ãã¤ãä½ç½®ï¼ã
`--pre` ãã£ã«ã¿ãè§£åãåæ§ã«å¤æå¾åºæºã
- é UTF-8 ãã¼ã¿ã¯ base64ï¼`bytes` ãã¼ï¼ã§è¡¨ç¾ãããã
ãããã£ã¦ãrg ã®åºããªãã»ããã¯å¸¸ã« UTF-8 ãã¤ãåä½ãã¨ã¿ãªããgreple ã®æåãªãã»ããã¸ã®
å¤æã¯æ°å¦çã«ã¯æ´åçã«å®ç¾©ã§ããï¼ãªãã»ããã¯æé ã«å±ãã®ã§ O(N) ã®ä¸åèµ°æ»ã§å¤æå¯è½ï¼ã
**ä½ç½®å¤æãã®ãã®ã¯æè¡çé害ã§ã¯ãªã**ãéå®³ã¯æ¬¡ç¯ä»¥éã§è¿°ã¹ãã³ã¹ãæ§é ã«ããã
### 3.2 æ¡ B ã®å®æ¸¬: JSON çµç±ã®ãªã¼ãã¼ããã
| å¦ç | æé |
|---|---:|
| `rg --json fox corpus.txt`ï¼96k ããããJSON 26MB åºåï¼ | 0.09s |
| âã Perl (JSON::PP) ã§ãã¼ã¹ | **8.0s** |
| ï¼åèï¼ç¾è¡ greple ã®åæ¤ç´¢å
¨ä½ | 0.82s |
ããã夿°æãJSON ã®ãã¼ã¹ã ãã§ç¾è¡ greple ã® 10 åã®æéããããï¼ã³ã¢ ã¢ã¸ã¥ã¼ã« JSON::PP ã®å ´åã
JSON::XS ã追å ä¾åã«ããã°æ°ç¾ ms ç¨åº¦ã¾ã§ç¸®ãããããã§ã byteâchar 夿ã»
ãããã¯æ§ç¯ãå ããã¨ç¾è¡ã¨ã®å·®ã¯ã»ã¼æ¶ããï¼ã
ãããå°æ°æã¯ããããã¹ãã£ã³ãã§ã¼ãºï¼80msï¼ããåããªãã**ã©ã¡ãã®ã±ã¼ã¹ã§ãå²ã«åããªãã**
### 3.3 libripgrepï¼grep cratesï¼
ripgrep 㯠`grep-matcher` / `grep-searcher` / `grep-printer` çã®ã¯ã¬ã¼ã群ã«åå²ããã¦ãã
ï¼[libripgrep PR #1017](https://github.com/BurntSushi/ripgrep/pull/1017)ï¼ã
ã©ã¤ãã©ãªã¨ãã¦åå©ç¨å¯è½ãæ£è¦è¡¨ç¾ã¨ã³ã¸ã³ã¯ Rust regexï¼æéãªã¼ãããã³ + SIMDï¼ã¨
PCRE2ï¼`--pcre2` / `-P`ãå¾èªã¿ã»å¾æ¹åç
§å¯¾å¿ï¼ã® 2 系統ã
- Rust regex ã¯å¾èªã¿ã»å¾æ¹åç
§ã»`(?{...})` é対å¿ãgreple ã¦ã¼ã¶ã¼ã®ãã¿ã¼ã³è³ç£ã¨ã¯æ¹è¨å·®ãããã
- PCRE2 ã¢ã¼ã㯠Perl ã«ããªãè¿ãããå®å
¨äºæã§ã¯ãªãã
## 4. åæ¡ã®è©³ç´°æ¤è¨
### æ¡ A: rg ããã¡ã¤ã«ã¬ãã«ã®ããªãã£ã«ã¿ã«ä½¿ã ãæ¨å¥¨ã
**ä»çµã¿**: `rg -l pattern dir` ã§ãããããå«ããã¡ã¤ã«ä¸è¦§ãã ãã rg ã«é«éåæããã
greple ã¯è©²å½ãã¡ã¤ã«ã®ã¿ã徿¥ã©ããå¦çãããä½ç½®æ
å ±ãåãæ¸¡ããªãã®ã§
ãã¤ã/æåãªãã»ããåé¡ã»æ£è¦è¡¨ç¾æ¹è¨åé¡ã®å½±é¿ãæå°åã§ããã
```
rg -l --null pattern dir | greple --readlist pattern
```
( run in 0.706 second using v1.01-cache-2.11-cpan-9581c071862 )