You slow your program down by using $`. Why do this, when
you can simply say (and these tests ALL ASSUME that you are
given a FULLY QUALIFIED name, meaning there is at least one
:: in it):
($package,$symbol) = $qualified_name =~ /(.*)::(.*)/;
I came up with another method, too, using rindex() and
unpack(). I benchmarked yours and mine in separate
processes so mine wouldn't be jinxed by yours using $`.
RESULTS:
$qualified_name = 'My::Class::Path::func'
Benchmark: timing 100000 iterations of Lunatic...
Lunatic: 15 wallclock secs (13.99 usr + 0.00 sys = 13.99 CPU)
$qualified_name = 'My::Class::Path::myfunc'
Benchmark: timing 100000 iterations of Jeff1, Jeff2...
Jeff1: 8 wallclock secs ( 8.95 usr + 0.00 sys = 8.95 CPU)
Jeff2: 9 wallclock secs ( 8.82 usr + 0.00 sys = 8.82 CPU)
I'll include my code below in a moment. I also tried these
on longer qualfied names, SPECIFICALLY one with a longer
symbol name. Note: disregard the "wallclock secs" times;
they're obviously munged up.
$qualified_name = 'My::Class::Path::myfuncdamnthisisareallylongstring'
Benchmark: timing 100000 iterations of Jeff1, Jeff2...
Jeff1: 12 wallclock secs (12.54 usr + 0.00 sys = 12.54 CPU)
Jeff2: 10 wallclock secs ( 9.55 usr + 0.00 sys = 9.55 CPU)
$qualified_name = 'My::REALLYLONGClass::PathPathPath::myfuncdamnthisis
+areallylongstring'
Benchmark: timing 100000 iterations of Jeff1, Jeff2...
Jeff1: 12 wallclock secs (12.73 usr + 0.00 sys = 12.73 CPU)
Jeff2: 8 wallclock secs ( 9.14 usr + 0.00 sys = 9.14 CPU)
$qualified_name = 'My::REALLYLONGClass::PathPathPath::myfunc'
Benchmark: timing 100000 iterations of Jeff1, Jeff2...
Jeff1: 11 wallclock secs ( 9.12 usr + 0.00 sys = 9.12 CPU)
Jeff2: 8 wallclock secs ( 8.78 usr + 0.00 sys = 8.78 CPU)
And there you have it. It seems my rindex() and unpack()
method outruns the regex approach every time. Here it is,
for your amusement and edification:
my ($pkg,$sym) = unpack
"A" . rindex($qualified_name, "::") . " x2 A*",
$qualified_name;
|