Re: DateTime performance

[email protected] ("Philipp K. Janert")
Newsgroups perl.datetime
Message-ID <[email protected]>
On Saturday 05 May 2012 17:14:52 N Heinrichs wrote:
> ++ to using precomposed TZ object (as you observed, supplying only the
> name as a string still results in lengthy DT:TZ object creation
> overhead.)
> 
> If you use them, I would also precompose any necessary Formatter or
> Locale objects.
> 

Thanks for the hint, but it does not apply to my
situation: most of the time, I am creating DateTime
objects from Unix epoch seconds; very occasionally
from individual pieces (year, month, etc). So, stuff
is already broken down quite nicely.

I'll check out the NO_VALIDATION option.

> 
> Depending on how you're parsing the date strings and composing the DT
> objects, `local $Params::Validate::NO_VALIDATION = 1;` can speed
> things up for you.
> 
> If you're using a DateTime::Formatter class to parse strings into DT
> objects for you, you might investigate using your own regex to chop up
> the string and call DT->new directly.
> 
> This code (including comments) is from early 2011 and I unfortunately
> do not have benchmark data handy:
> 
>         # NOTE: This method is faster than using DateTime::Formatter::MySQL
>         # NOTE2: It's also faster than `split m#[ /:T-]#`
>         $timestamp =~ m!^
>             (?:\s+)?(\d{4,4})[/-](\d{1,2})[/-](\d{1,2}) # Required date
> portion (?:[T\s](\d{1,2}):(\d{1,2}):(\d{1,2}))?     # Optional time
> portion (?:\s?([\w/\+:]+))?                         # Optional timezone
> $!x;
>         my ($y, $m, $d, $hr, $min, $sec, $tz) = ($1, $2, $3, $4, $5, $6,
> $7);
> 
> On 4 May 2012 13:20, Philipp K. Janert <[email protected]> wrote:
> > On Thursday 03 May 2012 02:14:45 you wrote:
> >> > From: Philipp K. Janert [mailto:[email protected]]
> >> > Sent: Wednesday, 2 May 2012 8:29 AM
> >> > 
> >> > Question:
> >> > 
> >> > When using DateTime for a large number of
> >> > instances, it becomes a serious performance
> >> > drag.
> >> 
> >> ...
> >> 
> >> > Is this expected behavior? And are there access
> >> > patterns that I can use to mitigate this effect?
> >> > (I tried to supply a time_zone explicitly, but that
> >> > does not seem to improve things significantly.)
> >> 
> >> Hi Phillip,
> >> 
> >> My #1 tip is to pre-prepare/cache the DateTime::TimeZone object and 
pass
> >> it in to each creation of a DateTime object (via whatever mechanism
> >> you're using to do that). I have seen a case where we were using
> >> time_zone => 'local' in a reasonably tight datetime object creation
> >> loop and saw significant speed increases just by cutting out that chunk
> >> of processing.
> >> 
> >> In hindsight that was a silly thing to do but it became an easy win :-)
> >> 
> >> I apologise if this is what you meant by supplying a time_zone
> >> explicitly in your comment above.
> > 
> > I have tried to specify the timezone explicitly as a string:
> >  $dt = DateTime->new( ..., time_zone => "America/Chicago" )
> > which does not seem to help, but I have not tried to do:
> >  $tz = DateTime::TimeZone( 'America/Chicago' )
> >  $dt = DateTime->new( ..., time_zone => $tz )
> > 
> > I'll try that the next time I have to process one of my data
> > sets again. ;-)
> > 
> > Thanks for the hint.
> > 
> >> I can't recommend using a tool like NYTProf highly enough on a run of
> >> your tool to spot the low hanging fruit. See
> >> https://metacpan.org/module/Devel::NYTProf
> >> 
> >> Cheers,
> >> 
> >> Andrew
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.