> Phil, please see the perlfunc entry for "pos" and the perlre section > on \G. This is what you need. Thanks a lot! I know about pos but thought it was read-only. And \G is relatively new, isn't it? Certainly wasn't existing in '97 when I learned perl :-) And the "basics" are seldom read again in the docs...
Thank you very much, although it's still 32% slower: 2505792 bytes to do ... Benchmark: timing 1000000 iterations of from_start, pos, re_dyn, re_once, substr, substr_set... from_start: 2 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 943396.23/s (n=1000000) pos: 0 wallclock secs ( 1.55 usr + 0.01 sys = 1.56 CPU) @ 641025.64/s (n=1000000) re_dyn: 7 wallclock secs ( 6.13 usr + 0.00 sys = 6.13 CPU) @ 163132.14/s (n=1000000) re_once: 2 wallclock secs ( 1.22 usr + 0.00 sys = 1.22 CPU) @ 819672.13/s (n=1000000) substr: 2 wallclock secs ( 2.39 usr + 0.01 sys = 2.40 CPU) @ 416666.67/s (n=1000000) substr_set: 3 wallclock secs ( 3.10 usr + 0.00 sys = 3.10 CPU) @ 322580.65/s (n=1000000) Rate re_dyn substr_set substr pos re_once from_start re_dyn 163132/s -- -49% -61% -75% -80% -83% substr_set 322581/s 98% -- -23% -50% -61% -66% substr 416667/s 155% 29% -- -35% -49% -56% pos 641026/s 293% 99% 54% -- -22% -32% re_once 819672/s 402% 154% 97% 28% -- -13% from_start 943396/s 478% 192% 126% 47% 15% -- Regards, Phil
#!/usr/bin/perl use Benchmark qw(cmpthese); $pos=500; $runs=1000000; $_=`cat /etc/* 2> /dev/null`; study $_; print length($_), " bytes to do ...\n"; cmpthese($runs, { "from_start" => sub { m/\S*\s+(\S+)/; }, "re_dyn" => sub { m/^[\x00-\xff]{$pos}\S*\s+(\S+)/; }, "re_once" => sub { m/^[\x00-\xff]{$pos}\S*\s+(\S+)/o; }, "substr" => sub { substr($_,$pos) =~ m/\S*\s+(\S+)/; }, "substr_set" => sub { $tmp=substr($_,$pos); $tmp =~ m/\S*\s+(\S+)/; }, "pos" => sub { pos($pos); m/\G\S*\s+(\S+)/; }, } );