Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

perf: close remaining 1.8x regex performance gap vs native Perl

已關閉
#1,907 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
5/5
預估耗時
一週以上
新手友好度
35/100
Issue 類型
功能
描述清晰度
基本清楚
活躍度
活躍
技術堆疊
java, perl
領域
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 repeated Long.toString() calls for variables that alternate between integer and string contexts.
  • Reduce PerlRuntime.current() calls: The state() helper calls PerlRuntime.current() (ThreadLocal read) multiple times per match. Could pass the PerlRuntime instance through the call chain.
Moderate impact, higher complexity
  • Joni Matcher reuse/pooling: The Matcher hierarchy (ByteCodeMachine → StackMachine → Matcher) is created fresh per match because bytes/str/end are final. A reset() method in the vendored Joni fork could allow reuse for different inputs.
  • Bytecode-emitted warning state: Move emitRegexWarningState work 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_ENCODINGS cache 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 範本
  • 閱讀貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

fglock/PerlOnJava 的其他 Issue

查看 fglock/PerlOnJava 的全部 Issue

相似的 Issue

更多 Perl Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。