#!/usr/bin/perl
use strict; use warnings;
# vim=:SetNumberAndWidth
################################################################################
use Benchmark qw(:all);
our @words;
my $count=@ARGV?$ARGV[0]:50000;
my $str=q( );
sub getss1() {
local $_ = $str;
my $start = 1+index $_, q(");
my $end = index $_, q("), $start;
$_ = substr $_, $start, $end;
}
use String::Index qw(cindex ncindex);
sub getss2() {
local $_ = $str;
my $start = 1+cindex $_, q(");
my $end = cindex $_, q("), $start;
$_ = substr $_, $start, $end;
}
sub getss3() {
@words = split q( ),$str;
local $_ = $words[1];
$_ = $words[1];
my $start = 1+index $_, q(");
my $end = index $_, q("), $start;
$_ = substr $_, $start, $end;
}
sub getsub1() {
local $_ = $str;
s/^[^"]*"([^"]+)".*$/$1/;
$_;
}
sub getsub2() {
local $_ = $str;
m{^[^"]*"([^"]+)".*$};
$1;
}
cmpthese($count, {
'ss1' => 'getss1',
'ss2' => 'getss2',
'ss3' => 'getss3',
'sub1' => 'getsub1',
'sub2' => 'getsub2',
});
# vim: ts=2 sw=2 ai number
####
> /tmp/bench
Rate sub1 sub2 ss2 ss3 ss1
sub1 384615/s -- -38% -38% -54% -69%
sub2 625000/s 62% -- -0% -25% -50%
ss2 625000/s 62% 0% -- -25% -50%
ss3 833333/s 117% 33% 33% -- -33%
ss1 1250000/s 225% 100% 100% 50% --