今時点のタイムスタンプ出したいだけならPOSIXで良いんじゃないかと。


明けましておめでとうございます。
今年は週1本でブログを書いて飛躍の年としたいと思っております。

という訳で新年1発目はド基本の日付関連。
気持ちは分かるんですが、やっぱり今時点のタイムスタンプ出したいだけならPOSIXで十分じゃ無かろうかと思う訳です。
日曜大工にブルドーザー的な大袈裟さが有るんじゃないかなぁと、という訳で理論武装するためにこんなに違うんだというベンチとってみました。

use strict;
use warnings;

use DateTime ();
use Time::Piece ();
use POSIX ();

use Benchmark;

our $FORMAT = '%Y-%m-%d %H:%M:%S';

sub posix {
    my $d = POSIX::strftime($FORMAT, localtime());
    return $d;
}

sub time_piece {
    my $d = Time::Piece->new->strftime($FORMAT);
    return $d;
}

sub datetime {
    my $d = DateTime->now(time_zone => 'Asia/Tokyo')->strftime($FORMAT);
    return $d;
}

my $b = Benchmark::timethese(10000, {
            posix   => \&posix,
            time_piece => \&time_piece,
            datetime => \&datetime,
          });

Benchmark::cmpthese($b);

ほんで結果。

Benchmark: timing 10000 iterations of datetime, posix, time_piece...
  datetime:  8 wallclock secs ( 6.93 usr +  0.01 sys =  6.94 CPU) @ 1441.44/s (n=10000)
     posix:  0 wallclock secs ( 0.14 usr +  0.02 sys =  0.16 CPU) @ 64000.00/s (n=10000)
            (warning: too few iterations for a reliable count)
time_piece:  1 wallclock secs ( 0.50 usr +  0.00 sys =  0.50 CPU) @ 20000.00/s (n=10000)
              Rate   datetime time_piece      posix
datetime    1441/s         --       -93%       -98%
time_piece 20000/s      1287%         --       -69%
posix      64000/s      4340%       220%         --

という訳でPOSIXが断然早い!と胸を貼って言えるようになりました。コード量も全くと言って良い程変わりませんしね。
当たり前の事ですが適材適所でこそモジュールは光を放つんでしょうねぇ。

と新年早々物思いに耽ってみました。