App-Greple
view release on metacpan or search on metacpan
RIPGREP-STUDY.md view on Meta::CPAN
ã³ã¼ãã¹: 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
```
æ¢åæ©æ§ãã»ã¼ãã®ã¾ã¾ä½¿ãã:
- `--readlist`ï¼`script/greple:1200-1201`ï¼: STDIN ãããã¡ã¤ã«ãªã¹ããåãåã
- `find.pm` ã® `!command` æ©æ§ï¼`find.pm:80`ï¼: ä»»æã³ãã³ãã§ãã¡ã¤ã«ãªã¹ããçæ
ï¼`dig.pm` ã find ã®èãã©ããã§ããã®ã¨åãæ§å³ã§ã`App::Greple::rg` ã¢ã¸ã¥ã¼ã«ãæ¸ããï¼
**å®è£
æ¡**: `App::Greple::rg` ã¢ã¸ã¥ã¼ã«ãæ°è¨ãã`greple -Mrg --rg <dir> pattern` ã§
1. greple ã®ãªãã·ã§ã³å¦çå¾ãæ¤ç´¢ãã¿ã¼ã³ãåå¾
2. ãã¿ã¼ã³ã rg ã«æ¸¡ãããå¤å®ï¼é¢æ°ãã¿ã¼ã³ `&func` ã Perl åºææ©è½ã¯ä¸å¯ï¼
3. 渡ããå ´å `rg -lP --sort path` ã§ãã¡ã¤ã«ãªã¹ãçæï¼`-P` ã§ PCRE2 = Perl æ¹è¨ã«æ¥è¿ã
`--sort` ã¯ä¸¦åæ§ã殺ãã®ã§åºåé ãåé¡ã«ãªãå ´åã®ã¿ï¼
4. 渡ããªãå ´å㯠`rg --files`ï¼ãã¡ã¤ã«åæã®ã¿ï¼ã«ãã©ã¼ã«ãã㯠â ããã§ã
.gitignore å°éã»ãã¤ããªã¹ãããã®æ©æµã¯ãã
**æ£ããã®æ¡ä»¶**: ããªãã£ã«ã¿ã¯ãgreple ãããããããã¡ã¤ã«ã®ä¸ä½éåããè¿ãå¿
è¦ãããã
注æç¹ã¨å¯¾ç:
( run in 1.154 second using v1.01-cache-2.11-cpan-9581c071862 )