fully short-circuit &&, ||, //
authorDavid Mitchell <davem@iabyn.com>
Thu, 14 Jul 2011 15:35:26 +0000 (16:35 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 14 Jul 2011 16:23:17 +0000 (17:23 +0100)
commitdb4d68cf2dda3f17d4e9fb440385189f55271b32
treeff5bc18625827c63d279962b641ee74b0eae10dd
parent0e1b3a4b35c4f6798b244c5b82edcf759e9e6806
fully short-circuit &&, ||, //

Currently in an expression like (A || B || C || D), if A is true, then
B, C and D aren't evaluated, but the 2nd, 3rd and 4th OR ops are *still*
executed. Use the peephole optimiser to bypass them.

i.e. change the op tree from

    - A - OR - OR - OR - X---
            \ /  \ /  \ /
             B    C    D
to
    - A - OR --------------------X---
            \                   /
             B - OR -----------/
           \          /
    C - OR --/
          \ /
   D

With this, the following code's execution time reduces from 1.6s to 0.9s
approx on my system:

    my $a = 1; my $b = 0; my $x = 0;
    for (1..10_000_000) {
if ($a || $b || $b || $b || $b || $b) {
    $x++;
}
    }
op.c