App-Greple

 view release on metacpan or  search on metacpan

RIPGREP-STUDY.md  view on Meta::CPAN


### 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 系統。

RIPGREP-STUDY.md  view on Meta::CPAN


### 案 B: rg --json の位置情報を greple 内部位置に変換する 【非推奨】

ユーザーが以前検討した方式。技術的には §3.1 のとおり「rg のオフセットは変換後 UTF-8 バイト基準」
なので、昇順オフセットを 1 パスで文字位置に変換すれば greple の内部表現に載せること自体は可能。
しかし:

1. **改善上限が小さい**: 削れるのはスキャンフェーズ(26MB あたり ~80ms)のみ。
   マッチ後処理(支配的コスト)は greple 側に残る。
2. **JSON オーバーヘッドが逆効果**: マッチ多数時、JSON::PP でパースに 8 秒(実測)。
   JSON::XS を依存に加えても変換・構築コストで利得はほぼ相殺。
3. **機能制約が多い**: 関数パターン(`&func`)不可、`--inside/--outside` の領域パターンも
   同様に外部化しないと片手落ち、`--if` フィルタとの合成、正規表現方言差、
   マッチ 0 幅・重なり領域のセマンティクス差、等の互換性穴が多数。
4. 表示のためどのみち該当ファイルのデコードと slurp は必要で、I/O 面の節約もない。

**結論**: 実装しても現行比でほぼ速くならず、互換性リスクだけ増える。

### 案 C: Rust ライブラリ (grep crates) を FFI::Platypus で呼ぶ 【非推奨】

**技術的成立性は確認できる**:



( run in 2.552 seconds using v1.01-cache-2.11-cpan-6aa56a78535 )