pperl 0.6.12#

2026-08-07 to 2026-08-14, 94 commits.

JIT and parallelization#

  • The new JIT engine is the default. The rebuilt JIT replaces the previous engine. It compiles the hot path of a loop to machine code and leaves the code around the loop, and the branches the loop rarely takes, to the interpreter. A loop whose compiled code keeps falling back to the interpreter is handed back to the interpreter entirely.

  • The previous JIT engine remains available with PPERL_JIT2=0. It is still faster on loops whose bodies hold many statements: the Benchmarks Game’s mandelbrot at size 16,000 takes 36.8 s on it and 204.7 s on the new engine. It is also the only one of the two that runs loops in parallel, so under the new default, auto-parallelization no longer applies to loops.

  • Arithmetic in compiled loops: integer and floating-point +, -, *, /, % and **, the assignments +=, -=, *=, /= and %=, numeric comparisons including <=>, the bitwise and shift operators, int, abs, unary minus, !, sqrt, sin, cos, exp, log, ++ and -- compile, on lexical and package variables. Integer values stay integers in compiled code, as they do in perl5. Benchmark loops of addition, multiplication, division and modulus run 4.27 to 5.06 times as fast as on perl5.

  • Strings in compiled loops: length, eq, ne, lt, gt, le, ge, cmp, concatenation, interpolation, .=, uc, lc, ucfirst, scalar reverse, ord, chr, substr and index compile, as do assignments of strings to variables. Loops that concatenate run 2.09 to 2.48 times as fast as on perl5, and loops using substr or index 2.90 and 2.99 times.

  • Arrays and hashes in compiled loops: reading and assigning elements of lexical arrays and hashes, $a[$i], $a[3] and $h{$k}, compiles, as do push, pop and list assignments such as @a = (...), %h = (...), ($x, $y) = ($y, $x) and my ($p, $q) = (...). A benchmark loop writing array elements runs 4.57 times as fast as on perl5, one reading them 3.10 times.

  • Conditionals in compiled loops: if/else blocks, the conditional operator ?:, my declarations and defined inside a loop body compile with the rest of the loop. A loop assigning a conditional expression runs 2.89 times as fast as on perl5.

Modules#

  • Encode encodes into the single-byte encodings, such as Latin-1, without searching a table for every character: a 1 KB string encodes at 5.8 times perl5’s speed, where it ran at 0.69 times. Strings of 64 KiB and more are encoded on several cores unless --no-parallel is given.

  • List::Util: sum, min, max and product over 65,536 or more integers are computed on several cores unless --no-parallel is given.

Documentation#

  • Module reference translations: the pages of B, IO, Data::Dumper, PerlIO::mmap and Time::HiRes in all 41 translation languages follow their corrected English text. Changed descriptions read in English until they are translated again.