perf: close remaining 1.8x regex performance gap vs native Perl
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
評估
- 難度
- 5/5
- 預估耗時
- 一週以上
- 新手友好度
- 35/100
- Issue 類型
- 功能
- 描述清晰度
- 基本清楚
- 活躍度
- 活躍
- 領域
- performance
研究方向
Start by running ./jperl dev/bench/benchmark_regex.pl and comparing it with native Perl, then inspect the listed hotspots and candidate optimizations in RuntimeScalar, JoniRegexMatcher, and PerlRuntime.current(). The issue leaves the optimization choice open; done means a measured improvement toward native Perl’s throughput without regressions.
由索引模型根據 Issue 內容生成。
描述
Context
PR #1905 reduced regex per-match overhead by ~2x (from ~10,453/s to ~22,100/s on the $i =~ /42/ benchmark). PerlOnJava is now ~1.8x slower than native Perl (~39,683/s) for simple regex matching.
This issue tracks closing the remaining gap to achieve near-parity with native Perl.
Profiling data (post-PR #1905)
Top remaining hotspots from async-profiler:
| % CPU | Source | Notes |
|---|---|---|
| 4.52% | RuntimeScalar.<init> |
Integer allocation overhead (loop iteration, not regex-specific) |
| 3.13% | HashMap.computeIfAbsent |
Encoding cache or other HashMap usage |
| 2.78% | JoniRegexMatcher.<init> |
New wrapper object per match |
| 2.44% | ThreadLocal.getEntry |
Remaining ThreadLocal reads (~3 per match) |
| 1.86% | StackMachine.<init> |
Joni internal — new matcher stack per match |
| 1.74% | getQuotedRegex |
Regex callsite cache lookup |
| 1.51% | RuntimeScalar.toStringLarge |
Integer→string conversion per match |
| 1.28% | JoniRegexPattern.byteInputEncoding |
Input encoding for byte-mode patterns |
Candidate optimizations
High impact, moderate complexity
- Integer-to-string dual-var caching: Cache the string representation in
RuntimeScalar(Perl's PV/IV dual-variable semantics). Would eliminate repeatedLong.toString()calls for variables that alternate between integer and string contexts. - Reduce
PerlRuntime.current()calls: Thestate()helper callsPerlRuntime.current()(ThreadLocal read) multiple times per match. Could pass thePerlRuntimeinstance through the call chain.
Moderate impact, higher complexity
- Joni Matcher reuse/pooling: The
Matcherhierarchy (ByteCodeMachine → StackMachine → Matcher) is created fresh per match becausebytes/str/endarefinal. Areset()method in the vendored Joni fork could allow reuse for different inputs. - Bytecode-emitted warning state: Move
emitRegexWarningStatework from runtime to the bytecode emitter, avoiding per-match ThreadLocal reads for warning state.
Lower impact
- Encoding cache bypass for varying inputs: The synchronized
INPUT_ENCODINGScache doesn't help when the input string changes every match (as in the benchmark). Consider a thread-local LRU or skip caching entirely for short ASCII strings. - JoniRegexMatcher simplification: For simple patterns (no /g, no callbacks, no locale), a lighter-weight matcher path could skip many conditional checks.
Benchmark
timeout 60 ./jperl dev/bench/benchmark_regex.pl
# Native Perl: perl dev/bench/benchmark_regex.pl
Related
- #1904 — original issue (closed by #1905)
- #1905 — rounds 1–3 optimizations
- 主要語言
- Perl
- 星號
- 65
- 分支
- 8
- 平均合併
- 6 小時 6 分鐘
- 30 天內合併 PR
- 185
環境準備
- 提供 Dockerfile 或 Docker Compose 檔案
- 沒有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
fglock/PerlOnJava 的其他 Issue
-
area:runtime documentation enhancement
難度 2/5 1-3 小時 新手友好度 72/100
fglock/PerlOnJava#1579 ·
維護者通常 1 天內回覆
-
area:cpan-port area:parser bug
難度 5/5 一週以上 新手友好度 35/100
fglock/PerlOnJava#1919 ·
維護者通常 1 天內回覆
-
area:performance enhancement
難度 5/5 一週以上 新手友好度 35/100
fglock/PerlOnJava#1911 · 1 則留言 ·
維護者通常 1 天內回覆
-
難度 4/5 3-5 天 新手友好度 35/100
fglock/PerlOnJava#1885 ·
維護者通常 1 天內回覆
-
area:cpan-port enhancement help wanted
難度 4/5 3-5 天 新手友好度 45/100
fglock/PerlOnJava#1880 · 2 則留言 ·
維護者通常 1 天內回覆
查看 fglock/PerlOnJava 的全部 Issue
相似的 Issue
-
bug
難度 2/5 1-3 小時 新手友好度 64/100
-
Type: Bug
難度 2/5 1-3 小時 新手友好度 78/100
inverse-inc/packetfence#9605 ·
維護者通常 10 天內回覆
-
難度 2/5 1-3 小時 新手友好度 72/100
-
bug
難度 2/5 1-3 小時 新手友好度 64/100
RotherOSS/otobo#6344 · 1 則留言 ·
維護者通常 1 天內回覆
-
難度 1/5 1 小時以內 新手友好度 85/100
darold/pgFormatter#426 ·