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:普通だったら気にしないが、今回はループの中で死ぬほど呼ぶ