組み込みを使うかWrapperを使うか、それが問題だ

naoyaのはてなダイアリー - きよへろのPerlコードをリファクタしようのコーナー No.2
やっぱり最初は localtime を素で使っちゃうよね。Perl の入門書にはおそらくほとんど localtime での例になってると思われます。しかし、僕なら Time::Piece を使う。
なぜって、localtime の関数型インタフェースがださすぎるから。Matt Sergeant タンのTime::Piece を使えば組み込みの localtime が OO インタフェースに変化します。

なのだけど、この手の組み込みはやたら実行回数が多い事も多く、そしてWrapperを使うとその分Performanceを失うことも多い。この手のWrapperの中で、Perl5に標準搭載されているものとしてはFile::statがあるが、これが以外と重かった。

search.cpan.org: BSD::stat - stat() with BSD 4.4 extentions
  Benchmark: timing 100000 iterations of BSD::stat, Core::stat,
  File::stat...
  BSD::stat:  3 wallclock secs ( 2.16 usr +  0.95 sys =  3.11 CPU) @
32160.80/s (n=100000)
  Core::stat:  1 wallclock secs ( 1.18 usr +  0.76 sys =  1.94 CPU) @
51612.90/s (n=100000)
  File::stat:  7 wallclock secs ( 6.40 usr +  0.93 sys =  7.33 CPU) @
13646.06/s (n=100000)

stat()はファイルシステムをなめるようなscriptだと、一回の動作で100万回呼び出すとかというのもザラなので、「かっこよく」書くためだけにOOP化Wrapperを使えるかというとビミョーなところである。

ちなみに上記で出たBSD::statは、私が昔書いた、BSD 4.4拡張版stat()にアクセスできるようにしたModuleで、FreeBSDのportsでもサポートされている。こちらがFile::statより速いのは、OOP版もXSで書いてあるから。

Wrapperを使うかどうかはこの辺も吟味した方がいいだろう。

ちなみに日付の扱いに関しては、以前本blogでも扱った事がある。今回はPOSIX::strftimeも紹介しておこう。こちらは標準添付である。これを使うと、例題は一行に収まってしまう。

perl -MPOSIX=strftime -le 'print strftime("%Y/%m/%d %H:%M:%S", localtime())'
ないし
perl -MPOSIX=strftime -le 'print strftime("%Y/%m/%d %T", localtime())'

だ。

この辺の選択は、経験が生きてくる範囲でもある。いろいろ試してみて欲しい。PerlのTMTOWTDIを最も感じ取れるところでもある。

Dan the Man with Too Many Ways to Do It