use warnings; use strict; use Date::Calc qw(Delta_DHMS Time_to_Date Delta_Days); use Date::Manip; use Benchmark qw(:all); use Data::Dumper::Simple; my @seconds = qw(-2147483648 -1 0 1 86399 86400 2147483648); my %contenders = ( cw_silly => { code => \&sec_to_dhms_silly }, cw_sensible => { code => \&sec_to_dhms_sensible }, Tanktalus => { code => \&sec_to_dhms_Tanktalus }, gam3 => { code => \&sec_to_dhms_gam3 }, gloryhack => { code => \&sec_to_dhms_gloryhack }, GrandFather => { code => \&sec_to_dhms_GrandFather }, #davidrw => { code => \&sec_to_dhms_davidrw }, #snowhare => { code => \&sec_to_dhms_snowhare }, ); for my $s (@seconds) { foreach my $c (keys %contenders) { my @res; eval { @res = $contenders{$c}{code}->($s); }; $contenders{$c}{$s} = defined @_ ? "@_" : "@res"; } } print Dumper(%contenders); our $data = 1000; cmpthese ( -10 , { cw_silly => sub { sec_to_dhms_silly($data) } , cw_sensible => sub { sec_to_dhms_sensible($data) } , Tanktalus => sub { sec_to_dhms_Tanktalus($data) } , gam3 => sub { sec_to_dhms_gam3($data) } , gloryhack => sub { sec_to_dhms_gloryhack($data) } , GrandFather => sub { sec_to_dhms_GrandFather($data) } , #davidrw => sub { sec_to_dhms_davidrw($data) } , #snowhare => sub { sec_to_dhms_snowhare($data) } } ); sub sec_to_dhms_gam3 { my $t = shift; return join ':' , int($t / 86400), (gmtime($t))[2, 1, 0]; } sub sec_to_dhms_GrandFather { my $t = shift; my @fields = ($t % 60, ($t /= 60) % 60, ($t /= 60) % 24, int ($t / 24)); return join ':', reverse @fields; } sub sec_to_dhms_Tanktalus { use integer; local $_ = shift; my ($d, $h, $m, $s); $s = $_ % 60; $_ /= 60; $m = $_ % 60; $_ /= 60; $h = $_ % 24; $_ /= 24; $d = $_; return join ':' , ($d, $h, $m, $s); } sub sec_to_dhms_sensible { shift; my ($d, $h, $m, $s); $s = $_ % 60; $_ = ($_ - $s) / 60; $m = $_ % 60; $_ = ($_ - $m) / 60; $h = $_ % 24; $_ = ($_ - $h) / 24; $d = $_; return join ':' , ($d, $h, $m, $s); } # uses Date::Calc sub sec_to_dhms_silly { my @epoch = (1970, 1, 1, 0,0,0); my @mytime = gmtime(shift); splice (@mytime, 6); # discard fields after 6th element (year) $mytime[5] += 1900; # gmtime returns year - 1900 $mytime[4]++; # gmtime has zero based month @mytime = reverse @mytime; # Delta_DHMS expects args in reverse to gmtime return join ':' , Delta_DHMS(@epoch, @mytime); } # uses Date::Calc sub sec_to_dhms_gloryhack { my $t = shift; return join ':' , $t < 0 ? '-' : '' , Delta_DHMS(Time_to_Date(0), Time_to_Date(abs($t))); } # uses Date::Calc sub sec_to_dhms_davidrw { my $t = shift; return join ':' , map { sprintf "%02d", $t } do{ my @d = Time_to_Date($t); ( Delta_Days((Time_to_Date(0))[0..2], @d[0..2]), @d[3..5] ) }; } # uses Date::Manip sub sec_to_dhms_snowhare { my $t = shift; return join ':' , Delta_Format("+${t}seconds",'exact','%dh','%hv','%mv','%sv'); } #### %contenders = ( 'Tanktalus' => { '86399' => '0:23:59:59', '86400' => '1:0:0:0', '1' => '0:0:0:1', '2147483648' => '24855:3:14:8', '0' => '0:0:0:0', '-2147483648' => '-24855:-3:-14:-8', '-1' => '0:0:0:-1', 'code' => sub { "DUMMY" } }, 'cw_sensible' => { '86399' => '0:0:0:0', '86400' => '0:0:0:0', '1' => '0:0:0:0', '2147483648' => '0:0:0:0', '0' => '0:0:0:0', '-2147483648' => '0:0:0:0', '-1' => '0:0:0:0', 'code' => sub { "DUMMY" } }, 'cw_silly' => { '86399' => '0:23:59:59', '86400' => '1:0:0:0', '1' => '0:0:0:1', '2147483648' => '-24855:-3:-14:-8', '0' => '0:0:0:0', '-2147483648' => '-24855:-3:-14:-8', '-1' => '0:0:0:-1', 'code' => sub { "DUMMY" } }, 'gam3' => { '86399' => '0:23:59:59', '86400' => '1:0:0:0', '1' => '0:0:0:1', '2147483648' => '24855:20:45:52', '0' => '0:0:0:0', '-2147483648' => '-24855:20:45:52', '-1' => '0:23:59:59', 'code' => sub { "DUMMY" } }, 'GrandFather' => { '86399' => '0:23:59:59', '86400' => '1:0:0:0', '1' => '0:0:0:1', '2147483648' => '24855:3:14:8', '0' => '0:0:0:0', '-2147483648' => '-24855:21:46:52', '-1' => '0:0:0:59', 'code' => sub { "DUMMY" } }, 'gloryhack' => { '86399' => ':0:23:59:59', '86400' => ':1:0:0:0', '1' => ':0:0:0:1', '2147483648' => '', '0' => ':0:0:0:0', '-2147483648' => '', '-1' => '-:0:0:0:1', 'code' => sub { "DUMMY" } } ); #### Rate cw_sensible cw_silly gloryhack GrandFather gam3 Tanktalus cw_sensible 27248/s -- -46% -67% -73% -75% -83% cw_silly 50161/s 84% -- -40% -49% -55% -68% gloryhack 83435/s 206% 66% -- -16% -25% -47% GrandFather 99258/s 264% 98% 19% -- -10% -37% gam3 110623/s 306% 121% 33% 11% -- -30% Tanktalus 157554/s 478% 214% 89% 59% 42% --