#!/usr/bin/perl -w # Copyright 2007, 2008, 2009, 2010 Kevin Ryde # This file is part of Tie-TZ. # # Tie-TZ is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free # Software Foundation; either version 3, or (at your option) any later # version. # # Tie-TZ is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along # with Tie-TZ. If not, see . # Usage: perl speed-timezone.pl # # Measure the relative speeds of Time::TZ, raw Tie::TZ, and # DateTime::TimeZone. # use strict; use warnings; use List::Util qw(min max); use Time::HiRes; use Tie::TZ; use Time::TZ; use DateTime; use DateTime::TimeZone; sub speed { my ($subr) = @_; my $t = 0; my $runs = 1; for (;;) { print " $runs runs"; my $s = Time::HiRes::time(); foreach (1 .. $runs) { &$subr(); } my $e = Time::HiRes::time(); $t = $e - $s; my $each = $t/$runs; my $ms = $each * 1000.0; printf " took %.6f, is %.3f milliseconds each\n", $t, $ms; if ($t > 2) { last; } if ($t == 0) { $runs *= 5; } else { $runs = max ($runs * 2, int (3.0 / $t + 0.5)); } } return $t / $runs; } # about 1.24ms each (used to be 0.17ms each without tzset) { print "Time::TZ\n"; my $timezone = Time::TZ->new (tz => 'Europe/London'); speed (sub { $timezone->call (sub { return 0; }); }); } # about 1.15ms each { print "Tie::TZ\n"; my $tz = 'Europe/London'; speed (sub { local $Tie::TZ::TZ = $tz; return 0; }); } # about 0.32ms each { print "DateTime::TimeZone\n"; my $tz = DateTime::TimeZone->new (name => 'Europe/London'); my $dt = DateTime->now(); speed (sub { $tz->offset_for_datetime($dt) }); exit 0; } { print "known:",Time::TZ::tz_known('EST+10'),"\n"; exit 0; } { my $timezone = Time::TZ->loco; print $timezone->iso_date,"\n"; } { my $timezone = Time::TZ->london; print $timezone->iso_date,"\n"; } exit 0;