oinume journal

Scratchpad of what I learned

Text::MicroTemplateのメモリ使用量をベンチマーク

Text::MicroTemplateの速度を簡単にベンチマークでText::MicroTemplateの動作速度を簡単にベンチマークしましたが、今回はメモリ使用量を他のテンプレートエンジンと比較してみました。環境はUbuntu 9.04 amd64, Perl 5.10.0 で、GTopを使って測っています。

useした時のメモリ使用量

独自に作ったスクリプト(use_memory_size.pl)でuse時のメモリ使用量を測ってみます。

$ ./use_memory_size.pl

3.2M : use HTML::Template

11.7M : use HTML::Template::Compiled

2.5M : use HTML::Template::Pro

264k : use Text::MicroTemplate

3.6M : use Template

HTML::Template::Compiledは多くのモジュールで構成されているので、メモリ使用量が多そうな感じです。一方、ソースコードがとてもコンパクトな Text::MicroTemplate は他のテンプレートエンジンと比べてメモリ使用量が一桁少ない。これはすごい。

use_memory_size.pl

#!/usr/bin/env perl

use strict;

use warnings;

for my $module (qw(HTML::Template

HTML::Template::Compiled

HTML::Template::Pro

Text::MicroTemplate

Template)) {

system "gtop.pl 'use $module'";

}

(プロセスのメモリ使用量を調べるために必要なGTopモジュール(およびlibgtop2)をインストールして、下記スクリプトをgtop.plとしてどこかパスの通ってるところに保存しておいてください)

gtop.pl

#!/usr/bin/env perl

use strict;

use warnings;

use GTop;

unless (@ARGV) {

print STDERR "Argument required.n";

exit 1;

}

my $gtop = GTop->new;

my $before = $gtop->proc_mem($$)->size;

eval $ARGV[0];

die $@ if $@;

my $after = $gtop->proc_mem($$)->size;

my $diff = GTop::size_string($after - $before);

print "$diff : $ARGV[0]n";

newしてレンダリングさせた後のメモリ使用量

モジュールをuseした時のメモリ使用量だけでなく、newしてoutputした後のメモリ使用量も調べてみました。結果は以下になります。

$ ./new_memory_size.pl

3.2M : use HTML::Template;my $t = HTML::Template->new(filename => q{template_speed_file.ht});my $s = $t->output;

11.7M : use HTML::Template::Compiled;my $t = HTML::Template::Compiled->new(filename => q{template_speed_file.ht});my $s = $t->output;

2.5M : use HTML::Template::Pro;my $t = HTML::Template::Pro->new(filename => q{template_speed_file.ht});my $s = $t->output;

796k : use Text::MicroTemplate::File;my $t = Text::MicroTemplate::File->new;my $s = $t->render_file(q{template_speed_file.mt})->as_string;;

11.4M : use Template;my $t = Template->new;$t->process(q{template_speed_file.tt}, {}, my $s);

相変わらずText::MicroTemplateは良好な成績ですね。あまりメモリを積んでいないマシンでもこれなら安心して使えそうな感じです。HTML::Template::Proも2.5MBと省メモリですね。スピードも爆速なので、テンプレートにゴリゴリPerlのコードを書く必要がない場合はこれが一番よいかもしれません。

new_memory_size.pl

#!/usr/bin/env perl

use strict;

use warnings;

# HTML::Template

my $ht = <<'...';

use HTML::Template;

my $t = HTML::Template->new(filename => q{template_speed_file.ht});

my $s = $t->output;

...

# HTML::Template::Compiled

my $htc = <<'...';

use HTML::Template::Compiled;

my $t = HTML::Template::Compiled->new(filename => q{template_speed_file.ht});

my $s = $t->output;

...

# HTML::Template::Pro

my $htp = <<'...';

use HTML::Template::Pro;

my $t = HTML::Template::Pro->new(filename => q{template_speed_file.ht});

my $s = $t->output;

...

# Text::MicroTemplate

my $mt = <<'...';

use Text::MicroTemplate::File;

my $t = Text::MicroTemplate::File->new;

my $s = $t->render_file(q{template_speed_file.mt})->as_string;;

...

# Template

my $tt = <<'...';

use Template;

my $t = Template->new;

$t->process(q{template_speed_file.tt}, {}, my $s);

...

for my $code ($ht, $htc, $htp, $mt, $tt) {

$code =~ s/n//g;

system qq{gtop.pl '$code'};

}

[rakuten]book:11995194[/rakuten]