#! /usr/bin/perl -w
use strict;
use POSIX;
use Benchmark;
sub via_anonsub {
sub { sprintf '%04d%02d%02d%02d%02d%02d%05d',
$_[5]+1900, $_[4]+1, $_[3], $_[2], $_[1], $_[0], $$
}->(localtime())
}
sub via_sprintf {
my @time = localtime();
sprintf '%04d%02d%02d%02d%02d%02d%05d',
$time[5]+1900, $time[4]+1, $time[3], $time[2], $time[1], $time[0], $$
}
sub via_concat {
my @time = localtime();
$time[4]++;
$time[5]+=1900;
$time[$_] = $time[$_]<10? "0".$time[$_]:$time[$_] for (0..5);
my $filename = $time[5].$time[4].$time[3].$time[2].$time[1].$time[0].$$
}
sub via_posix {
strftime( "%Y%m%d%H%M%S$$", localtime() )
}
print <<"PROOF";
via_concat: ${\via_concat()}
via_anonsub: ${\via_anonsub()}
via_posix: ${\via_posix()}
via_sprintf: ${\via_sprintf()}
PROOF
timethese( shift || 10000, {
'via_anonsub' => \&via_anonsub,
'via_concat' => \&via_concat,
'via_posix' => \&via_posix,
'via_sprintf' => \&via_sprintf,
});
####
$ perl filename 200000
via_concat: 2002091114542256876
via_anonsub: 2002091114542256876
via_posix: 2002091114542256876
via_sprintf: 2002091114542256876
Benchmark: timing 200000 iterations of via_anonsub, via_concat, via_posix, via_sprintf...
via_anonsub: 7 wallclock secs ( 5.60 usr + 0.28 sys = 5.88 CPU)
via_concat: 21 wallclock secs (18.71 usr + 0.55 sys = 19.27 CPU)
via_posix: 13 wallclock secs ( 9.59 usr + 0.62 sys = 10.20 CPU)
via_sprintf: 10 wallclock secs ( 6.67 usr + 0.39 sys = 7.06 CPU)
####
via_concat: 2002091114275977636
via_anonsub: 2002091114275977636
via_posix: 2002091114275977636
via_sprintf: 2002091114275977636
Benchmark: running via_anonsub, via_concat, via_posix, via_sprintf for at least 10 CPU seconds...
via_anonsub: 12 wallclock secs (10.12 usr + 0.51 sys = 10.62 CPU) @ 53156.42/s (n=564787)
via_concat: 10 wallclock secs (10.20 usr + 0.24 sys = 10.44 CPU) @ 30435.83/s (n=317674)
via_posix: 10 wallclock secs ( 9.57 usr + 0.93 sys = 10.50 CPU) @ 60954.29/s (n=640020)
via_sprintf: 10 wallclock secs (10.20 usr + 0.33 sys = 10.53 CPU) @ 44919.45/s (n=473058)
Rate via_concat via_sprintf via_anonsub via_posix
via_concat 30436/s -- -32% -43% -50%
via_sprintf 44919/s 48% -- -15% -26%
via_anonsub 53156/s 75% 18% -- -13%
via_posix 60954/s 100% 36% 15% --