Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

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

Geschlossen
#1,907 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Anfängerfreundlichkeit
35/100
Issue-Typ
Feature
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
java, perl
Bereich
performance

Rechercherichtung

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.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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
Vorherrschende Sprache
Perl
Sterne
65
Forks
8
Ø Merge
6 Std. 28 Min.
Gemergte PRs (30 T.)
181

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus fglock/PerlOnJava

Alle Issues in fglock/PerlOnJava

Ähnliche Issues

Weitere Issues zu Perl

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.