#! /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% --