MobaSiF::Template Introduction

Preview:

DESCRIPTION

MobaSiF::Template introduction on YAPC::Asia 2009 at 2009.09.10

Citation preview

MobaSiF::Template高速なテンプレートエンジン

DeNA - Tadashi Matsuda - bobppbobpp+yapc@bobpp.jp

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!

• 修飾子の追加等

まとめ

速いです!

• とにかく速いです

• この機能で事足りる場合は是非検討してください!

ありがとうございました

Recommended