Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Cerrado
#1,907 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
35/100
Tipo de issue
Nueva funcionalidad
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
java, perl
Área
performance

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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
Lenguaje dominante
Perl
Estrellas
65
Forks
8
Merge medio
6 h 28 min
PR fusionados (30 d)
181

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de fglock/PerlOnJava

Todos los issues de fglock/PerlOnJava

Issues similares

Más issues de Perl

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.