I've done some more tuning for DateTime-TimeZone, and believe that I've
cut down most of the bottlenecks from DT::TZ (and it should work for
those without XS)

I based most of my profiling and performance measurements on t/02basic.t
from DateTime::TimeZone distro, and here's the summary of improvements:

  - Using XS, as well as staying away from Singleton patterns
    saves us about 5% memory usage, which turns out to be somewhere
    around 6MB to 7MB when all zones are loaded.
  - Using my already-installed version of DateTime::TimeZone (the
    version from CPAN) against the optimized version, I see that
    the tuned version runs t/02basic.t about 30-40seconds faster.

...And here are my random findings:

  - I have to admit, while XS-fying the DateTime::TimeZone has
    its merits, it's a fine line between the choice to go
    with either PurePerl or XS DT::TZ, because it doesn't
    improve things *that* much.

    At least a straight port doesn't buy you much. If we are to
    expect perfomance gains from DT::TZ side, we'd have
    to rethink of the way timezone logic is handled.

    However, even if we decide not to go the XS route, I strongly
    suggest that the following be made:

      * stay away from singletons
      * incorporate my fixes to reduce date-math (see below)

  - Date math is terribly slow. Most of performance improvements
    from DT::TZ came from reducing the number of calls to
    DateTime::add_duration(). For example,

       my $diff = $dow - $dt->day_of_week;
       $dt->add(days => $diff);

    is definitely faster than

       while ($dt->day_of_week != $dow) {
         $dt->add(days => 1);
       }

    That also means that if we can somehow speed up DT::add_duration(),
    then overall perfomance will improve significantly

  - Just as a reference, here's Devel::DProf output of running
    t/02basic.t against DateTime-TimeZone-XS:

Total Elapsed Time = 92.19635 Seconds
  User+System Time = 42.84635 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 54.5   23.38 25.874 248526   0.0001 0.0001  Params::Validate::_validate
 17.5   7.518 11.644  51285   0.0001 0.0002  DateTime::Duration::new
 16.6   7.113 27.149  63321   0.0001 0.0004  DateTime::new
 8.73   3.742  6.443  64095   0.0001 0.0001  DateTime::TimeZone::new
 8.71   3.733 61.506  35208   0.0001 0.0017  DateTime::add_duration
 7.06   3.025 23.092  34867   0.0001 0.0007  DateTime::from_object
 5.15   2.207 22.768  13760   0.0002 0.0017
DateTime::TimeZone::OlsonDB::utc_d
                                             atetime_for_time_spec
 4.81   2.061  2.116  35215   0.0001 0.0001  Params::Validate::_validate_pos
 4.56   1.952  2.217  64470   0.0000 0.0000
DateTime::_calc_local_components
 3.98   1.707  3.700  13299   0.0001 0.0003
DateTime::TimeZone::OlsonDB::Chang
                                             e::new
 2.26   0.970  0.970 315752   0.0000 0.0000  DateTime::__ANON__
 1.97   0.843  0.843  34444   0.0000 0.0000  DateTime::clone
 1.90   0.813 23.050  13760   0.0001 0.0017
DateTime::TimeZone::OlsonDB::parse
                                             _day_spec
 1.74   0.747  0.572  35251   0.0000 0.0000  DateTime::set_time_zone
 1.48   0.635  4.431  16075   0.0000 0.0003  DateTime::Duration::inverse
 1.30   0.556  4.071   7216   0.0001 0.0006  DateTime::last_day_of_month
 1.28   0.549  0.549  34866   0.0000 0.0000  DateTime::Duration::deltas
 1.23   0.526  0.526  61465   0.0000 0.0000  DateTime::hms
 1.16   0.497 60.143 109800   0.0000 0.0005  DateTime::_calc_utc_rd
 1.12   0.482  0.608  61465   0.0000 0.0000  DateTime::ymd
 1.04   0.445  0.445  35208   0.0000 0.0000  DateTime::Duration::is_zero


My changes are all available on the xs branch:

https://svn.sourceforge.net/svnroot/perl-date-time/modules/DateTime-TimeZone/branches/xs
http://svn.sourceforge.net/viewcvs.cgi/perl-date-time/modules/DateTime-TimeZone/branches/xs/

HTH.

--d

Reply via email to