perf: close remaining 1.8x regex performance gap vs native Perl
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
- 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 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
- Langage dominant
- Perl
- Étoiles
- 65
- Forks
- 8
- Merge moyen
- 6 h 28 min
- PR mergées (30 j)
- 181
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de fglock/PerlOnJava
-
area:runtime documentation enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
fglock/PerlOnJava#1579 ·
Les mainteneurs répondent en général sous 1 jour
-
area:performance enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
fglock/PerlOnJava#1911 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
fglock/PerlOnJava#1885 ·
Les mainteneurs répondent en général sous 1 jour
-
Port Devel::Size for PerlOnJavaOuvertearea:cpan-port enhancement help wanted
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
fglock/PerlOnJava#1880 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
area:performance enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 20/100
fglock/PerlOnJava#1863 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de fglock/PerlOnJava
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
-
Type: Bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
inverse-inc/packetfence#9605 ·
Les mainteneurs répondent en général sous 10 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
RotherOSS/otobo#6344 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
darold/pgFormatter#426 ·