- 2006-06-04 (日)
- Perl
前回のエントリ 「Perlで日付・時間操作 - DateTime モジュールの使い方」で書いたとおり、とっても便利なDateTimeモジュールですが、強いて難点をあげるとすれば、必要な依存モジュールが多いこと = インストールが面倒くさい事かと個人的には思います。shell と make コマンドが使える環境ならば、"$ perl -MCPAN -e 'install DateTime' " で自動インストールしちゃえるのですが、これができない状況:
- telnet 禁止の環境で cgi 作りたい場合 (無料ホームページサービス等)(顧客のサーバ環境での開発で、クライアントに信用されていない状況とか)
- サーバの保守・セキュリティ体制がうんちゃらで make コマンドの利用が規制されている場合 (出くわした経験あり)
こんな状況下だと、とたんにDateTimeモジュールを利用する事は難しくなってしまいます。使いたいけど使えない。そんな状況でお悩みのあなたに・・・
Pure Perl な DateTime モジュール + 依存モジュールをまとめてみました
どんな環境でも (多分) 動作する、 Pure Perl 版の DateTime モジュール&すべての依存モジュールを含んだ状態の lib ディレクトリを zip アーカイブにしてみました。
上記 Download ボタンからアーカイブを入手した後、任意の環境下で解凍することで DateTimePack ディレクトリが作成されます。この中の lib ディレクトリを perl 側で use lib してあげることで、いつでもどこでも、すぐに DateTime モジュールのすべての機能を使い始めることができます。使い方については前回のエントリをご一読ください。
use lib 'DateTimePack/lib'; use DateTime; my $dt = DateTime->now(time_zone=>'local');
アーカイブの中身についての詳細説明は下記「配布アーカイブについて」を参照してください。
※こうやってCPANモジュールを再配布してよいものかどうか、ちょっとドキドキしてます。MovableTypeの中にも同じように DateTime モジュール一式入ってたし、まあ大丈夫かな?と。一応 Dave Rolsky氏本人には確認中。
以下、その他うんちくです
Pure Perl な DateTime って?
XSを利用しているのは DateTime モジュールと Params::Validate モジュールなんですが、これら共にきちんと Pure Perl 環境での動作を考慮して作られていました。まあ素敵。双方とも configure の際に
$ perl ./Makefile.PL --pm
のようなパラメータを渡すことで、コンパイル不要の .pm ファイルのみが生成されます。
ついでですが、いったんXS版としてインストールした後でも、以下の環境変数を設定してあげることで Pure Perl 版として動作するようです:
BEGIN {
$ENV{PERL_DATETIME_PP} = 1; # for DateTime
$ENV{PV_TEST_PERL} = 1; # for Params::Validate
}
こうすることでPure Perl版のモジュールの DateTimePP.pm と Params/ValidatePP.pm が代わりにロードされます。なので、いまXSなのかPurePerlなのかはこんなコードで判別可能かと:
if($::INC{'DateTimePP.pm'} &&
$::INC{'Params/ValidatePP.pm'} ){
print "Pure Perl\n";
}else{
print "XS\n";
}
Pure Perl だと、どれくらい遅くなる?
もともとは XS 実装が想定されているモジュールだけに、Pure Perl で動かそうとするとそれなりの速度ペナルティがあるはず。そこで、XS版とPurePerl版でベンチマーク比較してみました。 ごくごく普通の利用ケースを考えた、こんな感じの簡単なコードを用意して計測してみた結果は以下のとおり。※ tested on panasonic CF-R4 + colinux(debian)
# n=4000回 XS - 21 wallclock secs (20.86 usr + 0.17 sys = 21.03 CPU) PurePerl - 36 wallclock secs (35.63 usr + 0.19 sys = 35.82 CPU)
4000回まわした場合だと、180%増しな感じです。まあ、10倍遅い!致命的!って所まではいかないので、まぁ、よしかなぁ。
配布アーカイブについて
ディレクトリ構成
DateTimePack/ DateTimePack/lib # これを use lib DateTimePack/TestRunner.plx # テスト実行スクリプト DateTimePack/t # test code 一式 DateTimePack/TimeThis.plx # 簡単なベンチマークスクリプト DateTimePack/README # アーカイブ概略 DateTimePack/LICENSE # 一応
各モジュールのバージョン
DateTime - 0.31
DateTime::Locale - 0.22
DateTime::TimeZone - 0.45
DateTime::Format::HTTP - 0.36
DateTime::Format::Japanese - 0.01
Params::Validate - 0.81
動作確認について
DateTimeモジュールのテストコード一式を、そのままアーカイブに同梱させてありますので、以下の手順で、任意の環境下で動作確認がとれます:
$ cd DateTimePack $ ./TestRunner.plx # 出力結果に 'All tests successful' と出ればOK (問題なし)
動作確認したPerlのバージョン
5.8.4
5.6.2
その他
ライトユーザを考慮して、アーカイブ形式を .tar.gz じゃなくて zip にしてみた次第。 Windows側で解凍 > FTPで資源一式をアップロード、みたいな。