Skip to content

Instantly share code, notes, and snippets.

@xtetsuji
Created March 19, 2013 08:25
Show Gist options
  • Select an option

  • Save xtetsuji/5194482 to your computer and use it in GitHub Desktop.

Select an option

Save xtetsuji/5194482 to your computer and use it in GitHub Desktop.
Perl one of benchmark, strip ".html" extension from URL.
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
use File::Basename qw(fileparse);
my $URL = 'http://www.example.jp/path/to/foo.html';
my $EXT = '.html';
my $EXT_RE = qr/$EXT/;
my $COUNT = 1_000_000;
timethese($COUNT, {
'calc' => sub {
my $url = $URL;
my $ext = $EXT;
my $idx = index($url, $ext, length($url)-length($ext));
if ( -1 != $idx ) {
my $base_url = substr $url, 0, $idx;
return $base_url;
}
},
'regex1.0' => sub {
my $url = $URL;
my $ext_re = qr/$EXT/;
if ( $url =~ $ext_re ) {
( my $base_url = $url ) =~ s/$ext_re$//;
return $base_url;
}
},
'regex1.1' => sub {
my $url = $URL;
( my $base_url = $url ) =~ s/$EXT_RE$//;
return $base_url;
},
'regex1.2' => sub {
my $url = $URL;
$url =~ s/$EXT_RE$//;
return $url;
},
'regex2.0' => sub {
my $url = $URL;
$url =~ s/$EXT$//;
return $url;
},
'fileparse' => sub {
my $url = $URL;
my ($base, $dir, $ext) = fileparse($url, $EXT);
if ( $ext eq $EXT ) {
return $dir . $base;
}
}
});
__END__
Example:
Benchmark: timing 1000000 iterations of calc, fileparse, regex1.0, regex1.1, regex1.2, regex2.0...
calc: 2 wallclock secs ( 2.77 usr + 0.00 sys = 2.77 CPU) @ 361010.83/s (n=1000000)
fileparse: 29 wallclock secs (30.02 usr + 0.05 sys = 30.07 CPU) @ 33255.74/s (n=1000000)
regex1.0: 8 wallclock secs ( 8.52 usr + 0.00 sys = 8.52 CPU) @ 117370.89/s (n=1000000)
regex1.1: 2 wallclock secs ( 1.80 usr + 0.00 sys = 1.80 CPU) @ 555555.56/s (n=1000000)
regex1.2: 2 wallclock secs ( 1.81 usr + 0.00 sys = 1.81 CPU) @ 552486.19/s (n=1000000)
regex2.0: 0 wallclock secs ( 1.20 usr + 0.00 sys = 1.20 CPU) @ 833333.33/s (n=1000000)
@xtetsuji
Copy link
Author

Is "calc"'s excess cost almost from substitution ("=") and string copy?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment