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 小时 28 分钟
- 30 天内合并 PR
- 181
环境准备
- 提供 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:performance enhancement
难度 5/5 一周以上 新手友好度 35/100
fglock/PerlOnJava#1911 · 4 条评论 ·
维护者通常 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 天内回复
-
area:performance enhancement
难度 5/5 一周以上 新手友好度 20/100
fglock/PerlOnJava#1863 · 3 条评论 ·
维护者通常 1 天内回复
查看 fglock/PerlOnJava 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 72/100
-
难度 2/5 1-3 小时 新手友好度 82/100
维护者通常 1 天内回复
-
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