Text::MicroTemplate と Template-Toolkit のベンチマーク

Perlの軽量フレームワークMENTANanoA)から生まれた Text::MicroTemplateと、ご存じ Template-Toolkit の比較のため、ベンチマークしてみました。参考までに、こちらも有名どころの HTML::Template も入れてみました。

結果

Benchmark: timing 5000 iterations of HTML::Template, Template-Toolkit, Text::MicroTemplate...
HTML::Template:  2 wallclock secs ( 1.68 usr +  0.04 sys =  1.72 CPU) @ 2906.98/s (n=5000)
Template-Toolkit:  9 wallclock secs ( 8.73 usr +  0.36 sys =  9.09 CPU) @ 550.06/s (n=5000)
Text::MicroTemplate: 10 wallclock secs ( 8.83 usr +  0.44 sys =  9.27 CPU) @ 539.37/s (n=5000)
                      Rate Text::MicroTemplate Template-Toolkit   HTML::Template
Text::MicroTemplate  539/s                  --              -2%             -81%
Template-Toolkit     550/s                  2%               --             -81%
HTML::Template      2907/s                439%             428%               --

Mac OS X 10.5、Perl 5.8.8 にて。実際の使用にあわせて、キャッシュ有り、UTF-8フラグを立てる仕様で、単純なテンプレート処理を計っています(コードは下記)。ちなみに、Text::MicroTemplate Ver 0.05、Template-Toolkit Ver 2.21、HTML::Template Ver 2.9 を使用。

HTML::Template は低機能なだけあって速いですね。Text::MicroTemplate と Template-Toolkit は、いずれもPerlで実行できるソースコードを作り出してからそれを eval する仕組みなので、eval のコストがほとんどになってしまうようです。

それじゃあキャッシュさせなかったらどうよ、というベンチマークの結果は以下。キャッシュさせないように、テンプレートの内容を予め読み込んでおいて scalar_ref で渡すようにしています。

Benchmark: timing 5000 iterations of HTML::Template, Template-Toolkit, Text::MicroTemplate...
HTML::Template:  5 wallclock secs ( 5.34 usr +  0.01 sys =  5.35 CPU) @ 934.58/s (n=5000)
Template-Toolkit: 19 wallclock secs (19.17 usr +  0.05 sys = 19.22 CPU) @ 260.15/s (n=5000)
Text::MicroTemplate:  9 wallclock secs ( 9.06 usr +  0.04 sys =  9.10 CPU) @ 549.45/s (n=5000)
                     Rate Template-Toolkit Text::MicroTemplate    HTML::Template
Template-Toolkit    260/s               --                -53%              -72%
Text::MicroTemplate 549/s             111%                  --              -41%
HTML::Template      935/s             259%                 70%                --

最近の軽量フレームワーク

私の仕事としては、Perlモジュールが自由にインストールできない、ホスティングだったり管理者がうるさい自社サーバで使うものが多いので、最近の軽量フレームワークMojoなどはとてもありがたい存在です。ソースコードを読んで自分の業務にあった軽量フレームワークを作ったりして勉強しています。

Mojo::Template は今回の比較には入れませんでしたが、Text::MicroTemplate はこれをベースにしているので、同じような結果がでるのではないか、と思っています。

PHPでは、同じような理由で CakePHP を使ったりもしています。

こういったニーズって結構あるんじゃないかなぁと思っているのですが、Perlではなかなかメジャーな、PurePerl(コアモジュール含む)なフレームワークって無かったですよね。今回ベンチマークしたモジュールは、全て「.pm」ファイルを置くだけで実行できるPurePerlなテンプレートエンジンです。MENTANanoA の作者の方々に感謝しつつ、もっとこの流れが発展することを願っております。

ベンチマークのソース

use strict;
use warnings;
use utf8;
use Encode;
use Benchmark qw( timethese cmpthese );

use Text::MicroTemplate::File;
use Template;
use Template::Provider::Encoding;
use Template::Stash::ForceUTF8;
use HTML::Template;

my $times = shift @ARGV || 1000;

my $data = {
  items => [
    {
      id   => 'aaa',
      name => 'あいうえおかきくけこ',
      desc => '説明文1です。説明文1です。',
      stat => 0,
    },
    {
      id   => 'bbb',
      name => 'さしすせそたちつてと',
      desc => '説明文2です。説明文2です。',
      stat => 1,
    },
    {
      id   => 'ccc',
      name => 'なにぬねのはひふへほ',
      desc => '説明文3です。説明文3です。',
      stat => 0,
    },
  ],
  doc_root => '/path/to/document_root/',
};

my $tmpl_tt = './tmpl_tt.html';
my $tmpl_mt = './tmpl_mt.html';
my $tmpl_ht = './tmpl_ht.html';

binmode STDOUT, ':utf8';

my $comp = timethese( $times, {
  'Template-Toolkit'    => \&template_toolkit,
  'Text::MicroTemplate' => \&text_microtemplate,
  'HTML::Template'      => \&html_template,
} );

cmpthese( $comp );

sub template_toolkit {
  my $tmpl = Template->new(
    LOAD_TEMPLATES => [ Template::Provider::Encoding->new(
      RELATIVE => 1,
      COMPILE_DIR    => './cache_tt',
    ) ],
    STASH          => Template::Stash::ForceUTF8->new(),
  );
  my $html = '';
  $tmpl->process( $tmpl_tt, $data, \$html ) or die $tmpl->error();
  return $html;
}

sub text_microtemplate {
  my $tmpl = Text::MicroTemplate::File->new(
    cache => 1,
  );
  my $html = $tmpl->render_file( $tmpl_mt, $data );
  return ${$html};
}

sub html_template {
  my $tmpl = HTML::Template->new(
    filename => $tmpl_ht,
    die_on_bad_params => 0,
    cache => 1,
    filter => sub {
      my $text_ref = shift;
      ${$text_ref} = Encode::decode( 'utf8', ${$text_ref} );
    }
  );
  $tmpl->param( %{$data} );
  return $tmpl->output();
}

そうそう、Template-Toolkit の UTF-8 フラグ立てには、Template::Provider::Encodingを使っています。

WWDC 2009

WWDC 2009 はまさに盛りだくさんでしたね。iPhone 3G SSnow LeopardQuickTimeSafari 4、MacBook などなど。いずれも関心のあるトピックスなのですが、さすがにこれだけ一気に発表されると、追っかけきれません。

iPhone 3G S

まだまだ様子見を続けている自分ですが、そろそろマジで欲しくなってきています。キャリアの縛りがなかなか抜け出せない状況なのですが。DoCoMoからもiPhone出してくれないかなぁ。

Snow Leopard

これに関しては、ちょっとショッキングでした。

「Mac OS X Snow Leopardには、Intelプロセッサを搭載したMacが必要です。」

もう PPCのサポートが終わってしまうのですね・・・。自宅はInteliMacなのでいいですが、まだ PowerMac G4 MDD もたまに使っていますし、会社ではメインマシンとして PowerMac G5 を使っています。ブラウザとメールとテキストエディタを主に使う私としては、それほど古い・遅いとも感じていなかったのですよね(MDDは、うるさかったり、熱かったりしますが)。そんなMacでさえ、もう最新版のOSが動かなくなるなんて・・・。

こうなったらコレを理由に、会社ではMacBook買ってもらうしかないですね。

Safari 4

一番生業に関連しそうな話題ですが、まだ追っかけきれていません。HTML5のサポートがより進んでいるんだろうなぁ。まぁ、Macユーザはみんなすぐにアップデートするし、絶対数が少ないのでそれほど心配はしていないのですけどね。新しいブラウザが出る度に、楽しみよりも動作検証の手間を考えてしまうのは、この業界人の悲しいサガですね。

MacBook

近頃、嫁さんとMacの取り合いになることが多いので、新しいMac、それもMacBookが欲しいと思っていたところです。もうちょっと先の話だろうと思っていたところに、もう発表・発売になっちゃいましたね。

とっても欲しいのですが、引っ越しを控えている身としては・・・かなり迷っています。次にMacBookがアップデートされるのは、いつでしょうか。だれか教えてください。

リサイクルされる古いガジェットたち

同じところに長く住んでいると、なんとまぁ無駄なものが増えることか。近々引っ越しを予定しているので、あふれる"モノ"の整理を進めているところで、ちょうどよくこの記事を見ました。

我が家にも長らく使っていない電化製品が、ただでさえ狭い部屋にホコリを被るだけの状態で放置されています。これを機に一気に処分しようと思い立ちました。リユース・リサイクルしてくれるのであれば、愛着のあるものでも手放す気になるものです。

まずはスーパーに行って、ダンボール箱を調達してきました。野菜のカブが入っていたであろうダンボール箱がちょうどいい大きさだったので貰ってきたのですが、フタがない(上が空いている)ダンボール箱で少々難儀しました。ダンボールの選定は慎重にした方がよろしいようです。あとは、廃棄したいものを詰め込んで、宅急便で送るだけ。

廃棄したものは以下の通り。愛着のあるものが多かったので、紹介してしまいます。

VHSビデオデッキ

嫁さんがひとり暮らしを始めた時から使っていたもので、かなり前の型です。コンテンツがまだ無いわけではないのですが、ここ数年見ていないので、もう必要ないだろうということで廃棄しました。

フラットベッドスキャナ Canon CanoScanFB1210U

Mac OS 9 のころ(iMacが大ヒットした時代)の製品ですが、Mac OS X のサポートが行われず腹が立った思い出があります。今はEPSONのスキャナ・プリンタ一体型の製品を使っていますので、これも長らくホコリを被るだけの存在となっていました。

プリンタ Canon PIXUS 50i

小さいプリンタです。買ったときはそのコンセプトに惹かれたものですが、結局あまり使わなかったなぁ。

SONY Cyber-shot DFC-F2

初任給で買ったモノだったので、特に手放したくなかったモノです。初代Cyber-shotのセカンドモデルですね。デザイン的にも素晴らしいですよね。当時7万円ぐらいしていたと思います。この辺りに詳しい情報がありますが、発売日が1997年6月、35万画素で、USBもまだ無い時代ですよ。

この頃、自分のWebサイトで熱帯魚の水槽の写真を載せていたのですが、それはビデオカメラ→PowerMac8500のAV機能で取り込んだものでした。今考えるととてもアナログ。

Handspring Visor

Palm OSPDA、流行りましたよね。VisorPalm OS 搭載の廉価版PDAで、当時流行の"スケルトン"の筐体でした。いろいろと遊んだ記憶があり、なかなか捨てられない一品でした。

携帯電話

N503i と SH505i です。N503i は名機だったと思います。携帯電話も進歩するものですね。

USB接続のフロッピードライブ

もうフロッピーは使わないですよね。

断線したShure E2C

断線してしまったインナーイヤホン、Shure E2Cも破棄しました。詳しくはこちら

ケーブル類

ケーブル類ってたまりますよね。今後必要そうなケーブルだけを除いて、その他はすべて廃棄しました。

破棄したもの:SCSIケーブル・ターミネータ、Macのシリアル・ケーブル、上記Cyber-Shotのケーブル、ディスプレイ・ケーブル(DVIとかでないアナログのもの)等々・・・。ケーブルだけでも時代を感じさせられます。


といったところです。なんだか郷愁をそそられますね。

これらのものが、リユースされるのか、あるいは素材(金とか銅とかレアメタルとか)だけを抽出されてリサイクルさるのかはわかりませんが、単なるゴミとなることだけは避けられただけで、私としては満足しています。

Cache::File と Cache::FileCache の比較

とある仕事でファイルキャッシュを使う機会があったので、似た名前、ほぼ同じ機能の Cache::File と Cache::FileCache をベンチマークしてみました。

導入障壁という意味でも、より依存するPerlモジュールの少ない Cache::FileCache に軍配が上がりました。

ベンチマーク結果

Benchmark: timing 50 iterations of Cache::File (write), Cache::FileCache (write)...
Cache::File (write): 19 wallclock secs ( 4.89 usr + 11.79 sys = 16.68 CPU) @  3.00/s (n=50)
Cache::FileCache (write):  4 wallclock secs ( 1.26 usr +  1.32 sys =  2.58 CPU) @ 19.38/s (n=50)
                           Rate     Cache::File (write) Cache::FileCache (write)
Cache::File (write)      3.00/s                      --                     -85%
Cache::FileCache (write) 19.4/s                    547%                       --
Benchmark: timing 50 iterations of Cache::File (read), Cache::FileCache (read)...
Cache::File (read): 16 wallclock secs ( 4.00 usr + 10.99 sys = 14.99 CPU) @  3.34/s (n=50)
Cache::FileCache (read):  1 wallclock secs ( 0.50 usr +  0.22 sys =  0.72 CPU) @ 69.44/s (n=50)
                          Rate      Cache::File (read) Cache::FileCache (read)
Cache::File (read)      3.34/s                      --                    -95%
Cache::FileCache (read) 69.4/s                   1982%                      --

スクリプト

use strict;
use warnings;
use Benchmark qw( timethese cmpthese );
use Cache::FileCache;
use Cache::File;

my $times = shift @ARGV || 50;
my @chars = ( 'a'..'z' );

my $filecache = Cache::FileCache->new( {
  namespace => 'bench',
  default_expires_in => 6000,
  cache_root => '/tmp',
} );
$filecache->Clear();

my $file = Cache::File->new(
  cache_root => '/tmp/bench',
  default_expires => '6000 sec',
);
$file->clear();


my $comp = timethese( $times, {
  'Cache::FileCache (write)' => sub {
    foreach( @chars ) {
      $filecache->set( $_, $_ x 32 );
    }
  },
  
  'Cache::File (write)' => sub {
    foreach( @chars ) {
      $file->set( $_, $_ x 32 );
    }
  },
} );
cmpthese( $comp );

my $comp2 = timethese( $times, {
  'Cache::FileCache (read)' => sub {
    foreach( @chars ) {
      my $data = $filecache->get( $_ );
    }
  },

  'Cache::File (read)' => sub {
    foreach( @chars ) {
      my $data = $file->get( $_ );
    }
  },
} );
cmpthese( $comp2 );

$filecache->Clear();
$file->clear();

1;
__END__

キーボード復活!

先日書いた、キーボードが壊れた件について。

水洗い後、自然乾燥三日間にして、見事復活いたしました!あぁ良かった、無駄なお金使うことにならなくて。

ところで、久しぶりに古いキーボード使っていて思ったのですが、アルミの Apple Keyboard、いいですね。浅いから疲れない感じとか、デケデケいう(指の振動が机に伝わるような)感じのタイプ感とか。

キーボードが壊れた

愛用のApple Keyboard (US) が壊れました。

スペースキーを押しても利かず、すぐ上のNキーやBキーを押すと、ダダーっとスペースが連続で入力されます。

今は PowerMac G4 MDD に付属のキーボードを使ってこれを書いています。会社でも同じアルミのキーボードを使っているので違和感がありますね。ところで、慣れないキーボードを使っていると、半角入力に切り替える際に、Command+「`」(escキーの下のキー)してしまったり、コピーするのにCtrl+cしてしまう(要するにWindowsでのそれ)のは、私だけでしょうか。

よくよく思い出してみると、そういえば数日前に酒を少しこぼしていました。ちょこっとだけしかキーボードにかからなかったと思ったのですが、かかりどころが悪かったようですね。2〜3日前のことなのに、なぜ今日になって・・・。

このアルミのキーボード、分解はできなそうなのですが、ひとまずキートップは外れるようです。「In Digital World!: Apple Wireless Keyboardを掃除する」を参考に、数十円残っているIOカード(もはや懐かしい)を使って隙間を広げ、上の方から起こすようにして外します。Fキーやカーソルキー、enter、escの下の「`」キー、returnの上の「\」キーといった辺り(US配列ですが)は、ダンパーが横向きに付いているので、左から起こした方が取れやすいようですね。

で、すべて外すと以下のようになります。

センサーがおかしくなっているのだと思うのですが、ダメもとで水洗いしてみました。ひとまず2〜3日は乾燥させておくこととします。さぁ復活するでしょうか。