PHP include. Производительность.

dreamer

Member
Решил тут недавно ради интереса провести тест производительности некоторых операций подключения шаблонов в PHP.
Думаю многие знаю что такое шаблоны, кто не знает читайте , шаблоны это способ представления вида (View)
Собственно есть три подхода к этому делу (не считая сторонних разработок и модулей типа XML/XSLT):
  1. Подключение обычных PHP файлов, где описан шаблон
  2. Чтение, парсинг и исполнение шаблона на каком-то шаблонном языке
  3. Пункт 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
included.tpl:
Код:
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%
Поясню результаты:
  1. file_included - простой инклуд PHP шаблона, самый быстрый
  2. file_required - тот же инклуд, только в профиль
  3. file_evaled - отдельно чтение и исполнение PHP шаблона, немного медленней
  4. file_tpl_preg - парсинг шаблона регекспом, на 10-12 процентов медленней инклуда
  5. file_tpl_strtr - парсинг с помошью быстрой замены а строках, негибкий подход, но всего на 5-6 процентов медленней
  6. file_tpl_preg_cashe - парсинг регекспом и кэширование с автоматической проверкой устаревания кеша. По скорости почти так же как и то же самое без кэширования, похоже filemtime очень медленная функция
  7. file_tpl_manual_cashe - кэширование только с проверкой существования кеша (для парсинга нужно удалить старый кеш). Довольно неплохие результаты, всего на 6-7 процентов медленней инклуда.
Выводы делайте сами :)
 

Dre.hz

Active Member
Ответ: PHP include. Производительность.

Думаю для чистоты эксперимента еще нужно добавить clearstatcache().
 

e-progress

New Member
Ответ: PHP include. Производительность.

Хм...интересно, спасибо за инфо
 
Зверху