Another small speed up can be achieved by replacing
my $leaps = int( ($y - 1970) / 4 + 0.5 );
(((($y-1970)*365 +$leaps+MONTHS->{$m}+($d-1))*24 +$H)*60 +$M)*60 +
+$S;
with
(((int(($y-1970)*365.25-.5)+MONTHS->{$m}+$d)*24 +$H)*60 +$M)*60 +$S;
in my experiments between 5 to 10%. All other attempts using split and unpack are much slower. I found substr to be very fast:
sub str2epoch3 {
(((int((substr($_[0],12,4)-1970)*365.25-.5)+
MONTHS->{substr($_[0],8,3)}+substr($_[0],5,2))*24 +substr($_[0],1
+7,2))*60 +
substr($_[0],20,2))*60 +substr($_[0],23,2);
}
about 60% faster than BrowserUk's code. I wonder whether there is something wrong...
Here is my full code:
use strict;
use warnings;
use Benchmark qw/cmpthese/;
use constant MONTHS => { qw[
Jan 0 Feb 31 Mar 59 Apr 90 May 120 Jun 151
Jul 181 Aug 212 Sep 242 Oct 272 Nov 303 Dec 334
] };
sub str2epoch {
my( $d, $m, $y, $H, $M, $S ) = $_[0] =~
m[^.... (\d\d) (...) (\d\d\d\d) (\d\d):(\d\d):(\d\d)]
or die "Bad format $_[0]";
my $leaps = int( ($y - 1970) / 4 + 0.5 );
(((($y-1970)*365 +$leaps+MONTHS->{$m}+($d-1))*24 +$H)*60 +$M)*60 +
+$S;
}
sub str2epoch2 {
my( $d, $m, $y, $H, $M, $S ) = $_[0] =~
m[^.... (\d\d) (...) (\d\d\d\d) (\d\d):(\d\d):(\d\d)]
or die "Bad format $_[0]";
(((int(($y-1970)*365.25-.5)+MONTHS->{$m}+$d)*24 +$H)*60 +$M)*60 +$
+S;
}
sub str2epoch3 {
(((int((substr($_[0],12,4)-1970)*365.25-.5)+
MONTHS->{substr($_[0],8,3)}+substr($_[0],5,2))*24 +substr($_[0]
+,17,2))*60 +
substr($_[0],20,2))*60 +substr($_[0],23,2);
}
my $str = 'Fri, 01 Mar 2013 01:21:14 +0000';
cmpthese( -3, {BrowserUK => sub { str2epoch ($str) },
BUK2 => sub { str2epoch2($str) },
substr => sub { str2epoch3($str) }, }
);
</readmore>
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.