http://www.perlmonks.org?node_id=7118


in reply to Parsing Class Paths

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;