mktime と timelocal に速度差がある。
perl スクリプトをちょろちょろと書いていて、Time::Local の timelocal が変に遅いなにこれ遅い、と思って調べてみたところ、POSIX の mktime でも同じことが出来る、とあった。
my $count = 500000; timethese($count, { 'timelocal' => sub { my $today = timelocal(0, 0, 0, 1, 11, 113); }, 'mktime' => sub { my $today = mktime(0, 0, 0, 1, 11, 113); } });
実行結果:
mktime: 3 wallclock secs ( 1.56 usr + 1.38 sys = 2.94 CPU) @ 170068.03/s (n=500000) timelocal: 18 wallclock secs (19.18 usr + 0.00 sys = 19.18 CPU) @ 26068.82/s (n=500000)
mktime の方が速い。6.5倍くらいの速度差がある。なんだこれは*1・・・。実行環境は xen の仮想マシンなのでそういうことが影響しているのかなあ?良くわからない。
職場の Windows PC で実行してみたところ、
Benchmark: timing 500000 iterations of mktime, timelocal... mktime: 0 wallclock secs ( 0.48 usr + 0.00 sys = 0.48 CPU) @ 1033057.85/s (n=500000) timelocal: 17 wallclock secs (16.67 usr + 0.00 sys = 16.67 CPU) @ 29990.40/s (n=500000)
差は余計に広がり、35倍の差になった。
ソースみりゃ原因は判るんだろうけど、敷居が高いのでとりあえず謎のまま置いておくことにした。
*1:普通だったら気にしないが、今回はループの中で死ぬほど呼ぶ