Upload
tadashi-matsuda
View
3.190
Download
0
Embed Size (px)
DESCRIPTION
MobaSiF::Template introduction on YAPC::Asia 2009 at 2009.09.10
Citation preview
MobaSiF::Template高速なテンプレートエンジン
DeNA - Tadashi Matsuda - [email protected]
YAPC::Asia 2009 - 2009.09.10
アジェンダ• 自己紹介
• MobaSiF::Template の概要/使い方
• ベンチマーク
• 速さのヒ・ミ・ツ
• まとめ
自己紹介• 松田 唯史 (まつだ ただし)
• bobpp (ぼぶっぷ)
• http://bobpp.jp/
• (株) ディー・エヌ・エー
• モバオク(http://mbok.jp)のエンジニア
初 YAPC!
• YAPC 初参加です
• いきなり発表することになり緊張しまくってますが
• よろしくお願いします
•Twitter: BoBpp
•発表スライドなどリソースのせてます
Check this!
MobaSiF
Moba* Simple Framework
Moba*
• モバオク
• 2003年から安定して稼働
• モバゲータウン
• 5億PV/day をさばく
• and more...
Moba* Simple Framework
Mobile Simple Framework
ケータイ向けのシンプルなフレームワーク
YAPC::Asia 2008 にてオープンソース化
MobaSiF::Template
MTemplate
• MobaSiF::Template のベース
• MobaSiF 内蔵のテンプレートエンジン
• 名前空間が攻め過ぎ。
MobaSiF::Template
• 名前空間を整理 (MobaSiF::*)
• github による開発
• CPAN モジュール化
• 新機能
• テンプレートオートコンパイル
基本構成• テンプレートエンジン
• MobaSiF::Template
• テンプレートコンパイラ
• MobaSiF::Template::Compiler
• プリコンパイラは鋭意開発中
HTMLTemplate
(*.html)
HTMLTemplate
(*.html)
MobaSiF:::Template::Compilercompile
MobaSiF::Template::PreCompilerprecompile
IncludeTemplate
(*.txt/html)
CompiledTemplate
(*.bin)
HTMLTemplate
(*.html)
MobaSiF:::Template::Compilercompile
MobaSiF::Template::PreCompilerprecompile
IncludeTemplate
(*.txt/html)
CompiledTemplate
(*.bin)
HTMLTemplate
(*.html)
MobaSiF::Templateinsert / render
Output
(*.html)
MobaSiF:::Template::Compilercompile
MobaSiF::Template::PreCompilerprecompile
IncludeTemplate
(*.txt/html)
Compile Command
CompiledTemplate
(*.bin)
HTMLTemplate
(*.html)
MobaSiF::Templateinsert / render
Output
(*.html)
MobaSiF:::Template::Compilercompile
MobaSiF::Template::PreCompilerprecompile
IncludeTemplate
(*.txt/html)
HTMLTemplate
(*.html)
HTMLTemplate
(*.html)
HTMLTemplate
(*.html)
機能• 分岐
• 文字列比較
• 数値比較
• ループ
• 修飾子
• サニタイズ
• URL Encode
インストール
$ cpancpan> install MobaSiF::Template
使い方<テンプレート:表示>
<!-- Escape して表示 -->$=h:escape_string$
<!-- Escape せずに表示 (bypass) -->$=b:not_escape_data$
<!-- URL Encode して表示 -->$=e:url_encode_string$
使い方<テンプレート:分岐>
$ if (val > 10) { $ val が 10 より大きいです$ } elsif (val > 5) { $ val が 5 より大きいです$ } else { $ val が 5 以下です$ } $
使い方<テンプレート:ループ>
$ loop (list) { $ $=h:id$ / $=h:key$ / $=h:value$$ } $
使い方 <コンパイル>
use MobaSiF::Template::Compiler;
MobaSiF::Template::Compiler::compile(
“/path/to/template_file.html”,
“/path/to/compiled_binary_file.bin”
);
使い方 <表示>
use MobaSiF::Template;
my $param = +{ hoge => 1, fuga => [
+{ id => 1, value => ‘A’ },
+{ id => 2, value => ‘B’ },
] };
print MobaSiF::Template::insert(
“/path/to/compiled_binary_file.bin”, $param);
開発時自動コンパイル
use MobaSiF::Template;
my $param = +{...};
$MobaSiF::Template::DEVELOP = 1;
print MobaSiF::Template::render(
“/path/to/template_file.html”,
“/path/to/compiled_binary_file.bin”, $param);
開発時自動コンパイル
use MobaSiF::Template;
my $param = +{...};
$MobaSiF::Template::DEVELOP = 1;
print MobaSiF::Template::render(
“/path/to/template_file.html”,
“/path/to/compiled_binary_file.bin”, $param);
本番は 0 に
開発時自動コンパイル
use MobaSiF::Template;
my $param = +{...};
$MobaSiF::Template::DEVELOP = 1;
print MobaSiF::Template::render(
“/path/to/template_file.html”,
“/path/to/compiled_binary_file.bin”, $param);
性能は1割ほどdown 本番は 0 に
特徴
非常に高速
Benchmark! <Rivals>
• Template Toolkit
• Tenjin
• HTML::Template::Pro
• MobaSiF::Template
Benchmark
• 分岐/ループを織り交ぜたテンプレートを用意
• 10,000 回処理させてqpsを測定
Machine
• MacBook
• OS X 10.5 Leopard
• perl v.5.8.9
• 2.4GHz Core2 Duo
• 4GB Memory
Result.Benchmark#1
Result.0 5000.00 10000.00 15000.00 20000.00
585.8
2421.3
6451.6
17543.9
Template Toolkit
Tenjin
HTML::Template::Pro
MobaSiF::Template
Benchmark#1
なぜ高速なのか
binary template / XS
binary template
• 分岐・ループ・表示(option)...
• これらをすべてバイナリ表現
• 後述の XS で処理しやすいように
XS
• mmap によるファイル読み込み
• テンプレートに記載されたバイナリ指示をひたすら実行するだけ
バイナリ指示群
文字列データ群
バイナリ指示群
文字列データ群 文字データ+NULL
バイナリ指示群
文字列データ群 文字データ+NULL
文字列表示:PLAIN
分岐:IF/ELSE
ループ:LOOP / etc.
変数置換:REPLACE
シンプル
• 機能が少ない分高速
• 本来 View(Template) でやるべきことを違う層で処理する必要 = デメリット
開発予定
• Pre-Compiler
• Mobile Pre-Compiler
• compile files command
• tests!
• 修飾子の追加等
まとめ
速いです!
• とにかく速いです
• この機能で事足りる場合は是非検討してください!
CPAN / github
• http://search.cpan.org/~bobpp/MobaSiF-Template/
• http://github.com/bobpp/perl-MobaSiF-Template/
ありがとうございました