summaryrefslogtreecommitdiff
path: root/op.h
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-08-25 13:22:46 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-08-25 14:44:01 -0700
commit6ea72b3a1069e5b7ba4f03a9fb27f685d3ac4733 (patch)
tree688252f6052dfe90b2b7d5db98d00e95b8ad9439 /op.h
parenta43e79016be2ee77667099f1868307f7788bd811 (diff)
downloadperl-6ea72b3a1069e5b7ba4f03a9fb27f685d3ac4733.tar.gz
Optimise %hash in sub { %hash || ... }
In %hash || $foo, the %hash is in scalar context, so it has to iterate through the buckets to produce statistics on bucket usage. If the || is in void context, the value returned by hash is only ever used as a boolean (as || doesn’t have to return it). We already opti- mise it by adding a boolkeys op when it is known at compile time that || will be in void context. In sub { %hash || $foo } it is not known at compile time that it will be in void context, so it wasn’t optimised. This commit optimises it by flagging the %hash at compile time as being possibly in ‘true boolean’ context. When that flag is set, the rv2hv and padhv ops call block_gimme() to see whether || is in void context. This speeds things up signficantly. Here is what I got after optimis- ing rv2hv but before doing padhv: $ time ./miniperl -e '%hash = 1..10000; sub { %hash || 1 }->() for 1..100000' real 0m0.179s user 0m0.101s sys 0m0.005s $ time ./miniperl -e 'my %hash = 1..10000; sub { %hash || 1 }->() for 1..100000' real 0m5.446s user 0m2.419s sys 0m0.015s (That example is slightly misleading because of the closure, but the closure version takes 1 sec. when optimised.)
Diffstat (limited to 'op.h')
-rw-r--r--op.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/op.h b/op.h
index c4147cee2a..d977e5720e 100644
--- a/op.h
+++ b/op.h
@@ -221,6 +221,9 @@ Deprecated. Use C<GIMME_V> instead.
/* OP_RV2[AGH]V, OP_PAD[AH]V, OP_[AH]ELEM, OP_[AH]SLICE OP_AV2ARYLEN,
OP_R?KEYS, OP_SUBSTR, OP_POS, OP_VEC */
#define OPpMAYBE_LVSUB 8 /* We might be an lvalue to return */
+ /* OP_RV2HV and OP_PADHV */
+#define OpMAYBE_TRUEBOOL 64 /* %hash in (%hash || $foo) where
+ cx is not known till run time */
/* OP_SUBSTR only */
#define OPpSUBSTR_REPL_FIRST 16 /* 1st arg is replacement string */