dreamer
Member
Решил тут недавно ради интереса провести тест производительности некоторых операций подключения шаблонов в PHP.
Думаю многие знаю что такое шаблоны, кто не знает читайте
Собственно есть три подхода к этому делу (не считая сторонних разработок и модулей типа XML/XSLT):
Содержимое файлов:
included.php:
included.tpl:
Собственно результаты:
Поясню результаты:
Думаю многие знаю что такое шаблоны, кто не знает читайте
You must be registered for see links
, шаблоны это способ представления вида (View)Собственно есть три подхода к этому делу (не считая сторонних разработок и модулей типа XML/XSLT):
- Подключение обычных PHP файлов, где описан шаблон
- Чтение, парсинг и исполнение шаблона на каком-то шаблонном языке
- Пункт 2 но с кэшированием скомпилированного в PHP код шаблона
PHP:
<?php
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function test($funcname, $times = 100, $silent = true) {
$n = 0;
if ($silent) ob_start();
$t = getmicrotime();
while ($n < $times) {
call_user_func($funcname);
$n++;
}
$t = getmicrotime() - $t;
if ($silent) ob_end_clean();
return $t/$n;
}
function file_included() {
$vars['some'] = 'some';
include 'included.php';
}
function file_required() {
$vars['some'] = 'some';
require 'included.php';
}
function file_evaled() {
$vars['some'] = 'some';
$content = file_get_contents('included.php');
eval('?>'.$content);
}
function file_tpl_preg() {
$vars['some'] = 'some';
$content = file_get_contents('included.tpl');
$content = preg_replace('#\{(\w+)\}#', '<?= $vars[\'\1\'] ?>', $content);
eval('?>'.$content);
}
function file_tpl_strtr() {
$vars['some'] = 'some';
$content = file_get_contents('included.tpl');
$content = strtr($content, array(
'{' => '<? $vars[\'',
'}' => '\'] ?>',
));
eval('?>'.$content);
}
function file_tpl_preg_cashe() {
$file = 'included';
if (filemtime($file.'.tpl.php') < filemtime($file.'.tpl')) {
$content = file_get_contents('included.tpl');
$content = preg_replace('#\{(\w+)\}#', '<?= $vars[\'\1\'] ?>', $content);
file_put_contents($file.'.tpl.php', $content);
}
$vars['some'] = 'some';
include $file.'.tpl.php';
}
function file_tpl_manual_cashe() {
$file = 'included';
if (!file_exists($file.'.tpl1.php')) {
$content = file_get_contents('included.tpl');
$content = preg_replace('#\{(\w+)\}#', '<?= $vars[\'\1\'] ?>', $content);
file_put_contents($file.'.tpl1.php', $content);
}
$vars['some'] = 'some';
include $file.'.tpl1.php';
}
$tests = array('file_included', 'file_required', 'file_evaled', 'file_tpl_preg', 'file_tpl_strtr', 'file_tpl_preg_cashe', 'file_tpl_manual_cashe');
foreach ($tests as $test) {
print $test."...\n";
$res[] = test($test, 10000);
}
$mn = min($res);
print "---------------------\n";
foreach ($tests as $i => $test)
printf("%-25s %10.8f %5.2f%%\n", $test, $res[$i], $res[$i]*100/$mn);
included.php:
Код:
this is
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
<?= $vars['some'] ?>
variable
Код:
this is
{some}
{some}
{some}
{some}
{some}
{some}
{some}
{some}
{some}
{some}
variable
Код:
Тип теста Время % от скорейшего
file_included 0.00021430 100.00%
file_required 0.00021500 100.33%
file_evaled 0.00022488 104.94%
file_tpl_preg 0.00024208 112.96%
file_tpl_strtr 0.00022802 106.40%
file_tpl_preg_cashe 0.00024305 113.42%
file_tpl_manual_cashe 0.00023100 107.79%
- file_included - простой инклуд PHP шаблона, самый быстрый
- file_required - тот же инклуд, только в профиль
- file_evaled - отдельно чтение и исполнение PHP шаблона, немного медленней
- file_tpl_preg - парсинг шаблона регекспом, на 10-12 процентов медленней инклуда
- file_tpl_strtr - парсинг с помошью быстрой замены а строках, негибкий подход, но всего на 5-6 процентов медленней
- file_tpl_preg_cashe - парсинг регекспом и кэширование с автоматической проверкой устаревания кеша. По скорости почти так же как и то же самое без кэширования, похоже filemtime очень медленная функция
- file_tpl_manual_cashe - кэширование только с проверкой существования кеша (для парсинга нужно удалить старый кеш). Довольно неплохие результаты, всего на 6-7 процентов медленней инклуда.