Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

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

Fermée
#1,907 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
35/100
Type d'issue
Fonctionnalité
Clarté
Plutôt claire
Activité
Active
Stack technique
java, perl
Domaine
performance

Piste de recherche

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.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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
Langage dominant
Perl
Étoiles
65
Forks
8
Merge moyen
6 h 28 min
PR mergées (30 j)
181

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de fglock/PerlOnJava

Toutes les issues de fglock/PerlOnJava

Issues similaires

Plus d'issues Perl

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.