DateTime speed differences between perl 5.80 and 5.8.8?

[email protected] ("Erasmus Oblar")
Newsgroups perl.datetime
Message-ID <[email protected]>
I'm seeing some major performance differences between running DateTime on a
redhat 3 vs redhat 5 system.

System A: Redhat 3 update 8, x86_64 w/perl 5.8.0 and perl-DateTime-0.36,
perl-DateTime-Format-Strptime-1.0700
System B: Redhat 5 update 1, x86_64 w/perl 5.8.8 and perl-DateTime-0.42,
perl-DateTime-Format-Strptime-1.0702

Both systems are basically identical, although the processors on B are
slightly faster.

The code:
--------------------------------------------------------------
#!/usr/bin/perl
use warnings;
use strict;
use DateTime;
use DateTime::Format::Strptime;

my $time;
my $tsfile = "./timestamps";
my @stamps;
my $index = 0;

open(TIMES,"< $tsfile") || die "Unable to open $tsfile: $!\n";
while (<TIMES>) { chomp($stamps[$index++] = $_); }
close TIMES;

my $date_parser = DateTime::Format::Strptime->new(pattern=>'%Y%m%d-%T',
time_zone=>(DateTime::TimeZone::UTC->new),locale=>'en_US');

for (my $i = 0 ; $i <= $#stamps ; $i++) {
    $time = $date_parser->parse_datetime($stamps[$i]);
}
-----------------------------------------------------------------------
The timestamps file has 20000 timestamps that are formatted like this:
20080811-07:21:28.238

I used Devel::FastProf to gather performance metrics.

Machine A:
-bash-2.05b$ time perl -d:FastProf dt2.pl

real    0m43.720s
user    0m42.480s
sys     0m0.570s

Machine B:
-bash-3.1$ time perl -d:FastProf dt2.pl

real    1m58.994s
user    1m57.309s
sys     0m0.941s

From the profiler on machine A:
 -bash-2.05b$ fprofpp -t 15
# fprofpp output format is:
# filename:line time count: source
/usr/lib/perl5/site_perl/5.8.0/DateTime/Format/Strptime.pm:253 3.81141
50000: eval($parser);
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:130 3.02509 100001: sub { $_[0]
>= 1 && $_[0] <= 31 }
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:173 2.81100 100001: my %p =
validate( @_, $NewValidate );
/usr/lib/perl5/site_perl/5.8.0/DateTime/Locale.pm:199 1.50140 50003: my
($name) = validate_pos( @_, { type => SCALAR } );
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:124 0.99611 100001: sub { $_[0]
>= 1 && $_[0] <= 12 }
/usr/lib/perl5/site_perl/5.8.0/DateTime/Format/Strptime.pm:292 0.73812
50000: $self->local_croak("Your datetime does not match your pattern.") and
return undef
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:386 0.62451 100003: @{
$self->{local_c} }{ qw( year month day day_of_week
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:136 0.58766 100001: sub { $_[0]
>= 0 && $_[0] <= 23 },
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:390 0.55969 100003: @{
$self->{local_c} }{ qw( hour minute second ) } =
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:142 0.47269 50001: sub { $_[0]
>= 0 && $_[0] <= 59 },
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:544 0.40802 100001: return (
$_[0]->_is_leap_year( $_[1] ) ?
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:239 0.39095 100001: return
$self;
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:198 0.35999 100001:
$self->{local_rd_days} =
/usr/lib/perl5/site_perl/5.8.0/DateTime/Format/Strptime.pm:559 0.33324
50000: return $potential_return;
/usr/lib64/perl5/site_perl/5.8.0/DateTime.pm:201 0.32608 100001:
$self->{local_rd_secs} =

And from machine B:
# fprofpp output format is:
# filename:line time count: source
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:181
69.84134 100001: my $self = bless {}, $class;
/usr/lib/perl5/vendor_perl/5.8.8/DateTime/Format/Strptime.pm:253 5.21209
50000: eval($parser);
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:133
3.01017 100001: sub { $_[0] >= 1 && $_[0] <= 31 }
/usr/lib/perl5/vendor_perl/5.8.8/DateTime/Locale.pm:199 2.59622 50002: my
($name) = validate_pos( @_, { type => SCALAR } );
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:176
2.54915 100001: my %p = validate( @_, $NewValidate );
/usr/lib/perl5/vendor_perl/5.8.8/DateTime/Format/Strptime.pm:292 1.15773
50000: $self->local_croak("Your datetime does not match your pattern.") and
return undef
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:127
0.97971 100001: sub { $_[0] >= 1 && $_[0] <= 12 }
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:404
0.86898 100001: @{ $self->{local_c} }{ qw( year month day day_of_week
/usr/lib/perl5/vendor_perl/5.8.8/DateTime/Format/Strptime.pm:559 0.61761
50000: return $potential_return;
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:139
0.61577 100001: sub { $_[0] >= 0 && $_[0] <= 23 },
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:408
0.53709 100001: @{ $self->{local_c} }{ qw( hour minute second ) } =
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:220
0.51430 100001: $self->{utc_year} = $p{year} + 1;
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:201
0.50827 100001: $self->{local_rd_days} =
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:242
0.50361 100001: return $self;
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm:566
0.44811 100001: return ( $_[0]->_is_leap_year( $_[1] ) ?

Everything looks reasonable between the two machines, except for the *69
seconds* taken by  machine B in DateTime->new line 181.

Did something change regarding how expensive bless is in perl 5.8.0 vs
.5.8.8?

Is there a better way for this code to be written?  Any help would be much
appreciated.  If you'd like any other details, please let me know.

cheers,
E
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.