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 процентов медленней инклуда.

 
				 
 
		 
 
		