Or differences in compilers and flags used to build the versions.
$ perl -v | grep ^This This is perl, v5.8.3 built for i486-linux $ perl -V:gccversion gccversion='3.3.2'; $ perl -V:config_args config_args='-de -Dprefix=/usr -Dcccdlflags=-fPIC -Dinstallprefix=/usr + -Doptimize=-O3 -march=i486 -mcpu=i686 -Darchname=i486-linux';
The relevant bits for call context are in the runloop() function:
# ... if (ref $c eq 'CODE') { $subcode = "sub { for (1 .. $n) { local \$_; package $pack; &\$c; +} }"; $subref = eval $subcode; } else { $subcode = "sub { for (1 .. $n) { local \$_; package $pack; $c;} } +"; $subref = _doeval($subcode); } # ... &$subref;
(_doeval is basically a eval.)
So void context, but I don't think that matters here — the compiler doesn't know the context at the time of eval, so shouldn't be optimizing things away. One would have to instrument the code with a few B::Deparse calls to know for sure, of course. But going by the numbers from the benchmark, it doesn't seem to be making the difference.
There just seems to be a high startup overhead for first that amortizes over time, given enough time, for at least some Perls.
Makeshifts last the longest.
In reply to Re^17: Specializing Functions with Currying
by Aristotle
in thread Specializing Functions with Currying
by FoxtrotUniform
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |