Measured with the following crude perl script calling perf. Perl
is in there to get a rough baseline cost of starting perl:
print 'PERL', (`perf stat -r100 perl -e 1 2>&1`)[10];
print 'OLD ', (`perf stat -r100 perl lib/overload.pm 2>&1`)[10];
print 'NEW ', (`perf stat -r100 perl lib/overload2.pm 2>&1`)[10];
Produced the following results on my machine:
PERL 5,800,051 instructions # 1.05 insns per cycle ( +- 0.06% )
OLD 14,818,995 instructions # 1.16 insns per cycle ( +- 0.03% )
NEW 14,696,974 instructions # 1.16 insns per cycle ( +- 0.03% )
While the numbers did fluctuate between runs, the new code was
consistently faster.
package overload;
-our $VERSION = '1.26';
+our $VERSION = '1.27';
%ops = (
with_assign => "+ - * / % ** << >> x .",
);
my %ops_seen;
-for $category (keys %ops) {
- $ops_seen{$_}++ for (split /\s+/, $ops{$category});
-}
+@ops_seen{ map split(/ /), values %ops } = ();
sub nil {}
}
} else {
warnings::warnif("overload arg '$_' is invalid")
- unless $ops_seen{$_};
+ unless exists $ops_seen{$_};
$sub = $arg{$_};
if (not ref $sub) {
$ {$package . "::(" . $_} = $sub;