This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
make SETi/u/n, (X)PUSHi/u/n more efficient
authorDavid Mitchell <davem@iabyn.com>
Thu, 22 Oct 2015 15:43:49 +0000 (16:43 +0100)
committerDavid Mitchell <davem@iabyn.com>
Tue, 10 Nov 2015 13:52:34 +0000 (13:52 +0000)
commitedba15b0ccf22f00ea6d7cc58eb2c173437a09cc
tree5059ae1193b24bff9924af56d20536824f3e2a77
parentd48c660dfce02fc4e698f3b0589c77612ecf27a4
make SETi/u/n, (X)PUSHi/u/n more efficient

These macros are used by many pp functions to set TARG to an int or float
value and put it on the stack. The macros use a call to sv_setiv()
or similar.

However, there is a good chance that the target is ether a lexical var
or a PADTMP that has been assigned just an IV/NV in the past, in which
case its body is likely to still be of type SVt_IV/SVt_NV. If this is
the case, we can set its value much more efficiently.

Update those setting macros to first check if the target has a simple
body, and if so, set directly.

This makes quite a significant performance difference on code that does
a lot of arithmetic, at the cost of a larger binary (0.36% on my Linux
x86_64 system).

It also allows you (at compile time) to skip testing for taint if you
know that the value can't be tainted (e.g. pp_add() when both args are
non-magical and so can't have taint magic attached). The next commit will
make use of this.

Includes a couple of efficiency tweaks suggested by Daniel Dragan.
pp.h