Smarty是PHP語言裡面最經典的模板引擎,如果你曾經開發過PHP程式,那麼或多或少都有使用過它。Smarty在2010年發布了第三版,Smarty 3用當下最新的PHP5進行了重構。它保留了原有的文法並加入了一些更現代的特性。 Twig是來自Symfony開發人員,Twig作者將其定位成一個快速及功能強大的現代模板引擎。Twig有著許多與Smarty 3相似的特性,但為了提高效能而稍微有些不同。 現在我們來將兩者進行一下效能對比測試:
測試 我們準備了較複雜的模板以便可以明顯看出程式執行的時間,以下是我們的代碼: 相同的功能,看起來Smarty實現更簡單些:
$data = json_decode(file_get_contents('data.json'), true); require('smarty/Smarty.class.php'); $smarty = new Smarty(); $smarty->compile_check = false; $start = microtime(true); $smarty->assign($data); $smarty->fetch('demo.tpl'); echo microtime(true)-$start;
Twig更複雜些:
$data = json_decode(file_get_contents('data.json'), true); require('twig/Autoloader.php'); Twig_Autoloader::register(); $loader = new Twig_Loader_Filesystem('templates'); $twig = new Twig_Environment($loader, array( 'cache' => 'templates_c', 'autoescape' => false, 'auto_reload' => false, )); $start = microtime(true); $template = $twig->loadTemplate('demo.tpl'); $template->render($data); echo microtime(true)-$start;
兩個程式都做了同樣的配置:關閉二次編譯、不顯示頁面,只留下執行時間的顯示。 從變數中擷取值 從變數中擷取值是比較常用的操作,在較複雜的模板開發中或許會用上幾百次。我們或許會認為該操作的執行速度不需要依賴於模板,但不是的,模板引擎會在模板中用一些資料結構來儲存變數的值,所以擷取變數值的操作需要更簡單和快速的效能。下面我們將產生一個帶有10000個值的模板以比較效能。 Smarty:
| {$var0} {$var1} {$var2} {$var3} {$var4} ... |
Twig:
| {{ var0 }} {{ var1 }} {{ var2 }} {{ var3 }} {{ var4 }} ... |
Result:
| |
Compiling |
Execution |
| Smarty 3.1.1 |
16.320 seconds |
0.058 seconds |
| Twig 1.2.0 |
9.757 seconds |
0.083 seconds |
上面的表格示範了多次連續測試的平均值。我們可以看到程式已經編譯產生了1萬個變數的模板,Smarty在編譯的時候是遠遠落後於Twig。不過編譯僅僅是第一次訪問的時候執行,之後會一直使用編譯後的頁面,所以編譯後的頁面執行速度才是更重要的。編譯後的執行時間,Smarty是比Twig快速了30%左右, 使用多次foreach來測試 一般開發中模板經常用到foreach,這裡我們用了1000個帶有十個元素的數組,來測試一下兩個模板引擎的foreach效能。
Smarty:
{foreach $array as $item} {$item.id} {$item.title} {$item.var1} {$item.var2} {$item.var3} {$item.var4} {$item.var5} {$item.var6} {$item.var5} {$item.var6} {/foreach}
Twig:
{% for item in array %} {{ item.id }} {{ item.title }} {{ item.var1 }} {{ item.var2 }} {{ item.var3 }} {{ item.var4 }} {{ item.var5 }} {{ item.var6 }} {{ item.var5 }} {{ item.var6 }} {% endfor %}
Result: .