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

Reply via email to