Re: DateTime::Lite

[email protected] ("Yitzchak Scott-Thoennes")
Newsgroups perl.datetime
Message-ID <[email protected]>
On Sat, November 22, 2008 12:50 am, Daisuke Maki wrote:
> So I have this requirement to make DateTime leaner, in terms of speed,
> load time, and the amount of memory consumed. The target is for casual
> users, so the use of XS code is not an option either.

In terms of speed, one of the things that's unique (AFAIK) to
DateTime is being able to thread-safely convert a datetime from
one timezone to another.

I'd be curious to know how it fares in this regard.  Here's a
benchmark that for me shows DateTime proper almost ten times as
slow as non-thread-safely using libc routines (suggestions for
improvement enthusiastically welcomed):

#!/usr/bin/perl -l

use strict;
use warnings;
use DateTime;
use Env::C;
use POSIX "mktime";

sub convert_timezone_datetime {
    my ($y,$mo,$d,$h,$m,$s,$tz,$new_tz) = @_;

    my $dt = DateTime->new(year=>$y, month=>$mo, day=>$d, hour=>$h,
minute=>$m, second=>$s,time_zone=>$tz);
    $dt->set_time_zone($new_tz);

    return map $dt->$_, qw/year month day hour minute second/;
}

sub convert_timezone_env_c {
    my ($y,$mo,$d,$h,$m,$s,$tz,$new_tz) = @_;
    my $save_tz = Env::C::getenv("TZ");

    Env::C::setenv("TZ",$tz,1);
    my $time = POSIX::mktime($s,$m,$h,$d,$mo-1,$y-1900,0,0,-1);

    Env::C::setenv("TZ",$new_tz,1);
    POSIX::tzset(); # localtime_r bug
    ($s,$m,$h,$d,$mo,$y) = localtime($time);
    $mo++; $y+=1900;

    # this belongs in a destructor
    if (defined $save_tz) { Env::C::setenv("TZ",$save_tz,1) }
    else { Env::C::unsetenv("TZ") }

    return ($y,$mo,$d,$h,$m,$s);
}

sub convert_timezone_system {
    my ($y,$mo,$d,$h,$m,$s,$tz,$new_tz) = @_;

    local $ENV{"TZ"} = $tz;
    my $time = POSIX::mktime($s,$m,$h,$d,$mo-1,$y-1900,0,0,-1);

    $ENV{"TZ"} = $new_tz;
    POSIX::tzset(); # localtime_r bug
    ($s,$m,$h,$d,$mo,$y) = localtime($time);
    $mo++; $y+=1900;

    return ($y,$mo,$d,$h,$m,$s);
}

print join ",",
datetime=>convert_timezone_datetime(2008,7,3,23,2,3,"America/Denver","America/New_York");
print join ",",
registry=>convert_timezone_env_c(2008,7,3,23,2,3,"America/Denver","America/New_York");
print join ",",
"system"=>convert_timezone_system(2008,7,3,23,2,3,"America/Denver","America/New_York");

use Benchmark "timethese";
timethese(-5, {
    datetime => sub { my ($y,$mo,$d,$h,$m,$s) =
convert_timezone_datetime(2008,7,3,23,2,3,"America/Denver","America/New_York");
return },
    env_c => sub { my ($y,$mo,$d,$h,$m,$s) =
convert_timezone_env_c(2008,7,3,23,2,3,"America/Denver","America/New_York");
return },
    "system" => sub { my ($y,$mo,$d,$h,$m,$s) =
convert_timezone_system(2008,7,3,23,2,3,"America/Denver","America/New_York");
return },
} );
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.