Шаблонный движок

korchasa

LIMB infected
Автор оригинала: atv
а преобразование, разве, будет делаться двумя головами?
А почему нет, при условии, что "преобразователей" несколько? Я курс, многопроцессорных систем три года назад проходил, может и забыл что-то, но не вижу препятствий для распараллеливания двух процессов с единственным общим внешним ресурсом - файловой системой.
 

atv

Новичок
при условии, что "преобразователей" несколько
Но время то будет замеряться для одного процесса. И зачем тебе это время, без сравнительной характеристики...

Вот доделаем проект (до конца мая), проведём нагрузочное тестирование (с учётом XSLT cache), посмотрим что получиться.
 

korchasa

LIMB infected
Автор оригинала: atv
Но время то будет замеряться для одного процесса. И зачем тебе это время, без сравнительной характеристики...
Просто у меня сильные подозрения, что в начале будет пауза на инициализации (размещение словаря хотя бы). Но я не знаю, как это внутри работает, потому и интересны абсолютные цифры.
 

CatManZero

Новичок
Ради интереса набросал небольшой бенчмарк:
PHP:
<?php
function bench_php() 
{
  $data = array();
  for($n = 0; $n < 100; $n ++)
  {
    $data[$n] = $n;
  }
  include('php_template.php');
}

function bench_xslt()
{
  $data = new DOMDocument('1.0', 'utf-8');
  $root_node = $data->appendChild($data->createElement('data'));
  for($n = 0; $n < 100; $n ++)
  {
    $root_node->appendChild($data->createElement('n', $n));
  }
  $template = new DOMDocument();
  $template->load('xslt_template.xsl');
  $proc = new XSLTProcessor();
  $proc->importStylesheet($template);
  echo $proc->transformToXml($data);
}

function bench_xml()
{
  $data = new DOMDocument('1.0', 'utf-8');
  $data->appendChild($data->createProcessingInstruction('xml-stylesheet', 'href="xsl_template.xsl" type="text/xsl"'));
  $root_node = $data->appendChild($data->createElement('data'));
  for($n = 0; $n < 100; $n ++)
  {
    $root_node->appendChild($data->createElement('n', $n));
  }
  echo $data->saveXML();
}

function bench($func)
{
  $start_time = microtime(true);
  for($n = 0; $n < 1000; $n ++) {
    ob_start();
    $func();
    ob_end_clean();
  }
  echo round(microtime(true) - $start_time, 2), ' - ', $func;
}

$funcs = array('bench_php', 'bench_xslt', 'bench_xml');
foreach($funcs as $func) 
{
  bench($func);
  echo "\r\n";  
}
?>
php_template.php:
PHP:
<?php
foreach($data as $n) echo $n,',';
?>
xslt_template.xslt:
PHP:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl: output method="html" encoding="utf-8"/>
  <xsl:template match="/data/n"><xsl:value-of select="."/>,</xsl:template>
</xsl:stylesheet>
В среднем у меня такие результаты получаются:
0.4 - bench_php - шаблонизация средствами php
2.7 - bench_xslt - xslt-трансформация на сервере
1 - bench_xml - в принципе можно считать, что - это клиентская xslt-трансформация
 

CatManZero

Новичок
Автор оригинала: dark-demon
> for($n = 0; $n < 100; $n ++){ $root_node->appendChild($data->createElement('n', $n));

удивительно, что эта конструкция так быстро пашет :)
попробуй взять этот метод за основу: http://smileg.jino-net.ru/printer/xslt.inc
Добавил такую функцию:
PHP:
function bench_xml2()
{
  $data = array();
  for($n = 0; $n < 100; $n ++)
  {
    $data['n'.$n] = $n;
  }
  echo convertNative2xml(array('data' => $data));
}
Результат в среднем такой:
1.01 - bench_xml
0.9 - bench_xml2

В принципе разница не очень большая.
 

dark-demon

d(^-^)b
гм.. а если так?

PHP:
function convertNative2xml( $var, $name='data' ){
    echo '<o:item key="' . $name . '">';
    if( is_scalar( $var ) ) echo $var;
    else foreach( $var as $n => $v ) convertNative2xml( $v, $n );
    echo "</o:$name>";
}
 

atv

Новичок
Ради интереса набросал небольшой бенчмарк:
Можно было и без этого теста сказать, что php будет быстрее, вот только "шаблонизацией средствами php" это никак не назовёш.

Если бы ты сравнил страницу, сгенерированную по типу Symfony, и такую же страницу, полученную XSLT преобразованием, в которой содержался бы вывод дерева или таблицы по каким либо входным данным, вот тогда результат был бы интересным.
 

CatManZero

Новичок
Автор оригинала: atv
Можно было и без этого теста сказать, что php будет быстрее....
Лично мне больше интересно было не что быстрее, а на сколько...
Автор оригинала: atv
вот только "шаблонизацией средствами php" это никак не назовёш.
Это я попытался уравнять условия для php и xslt :D
Но, судя по результатам, это было бессмысленно...

-~{}~ 14.01.08 17:40:

Автор оригинала: dark-demon
гм.. а если так?

PHP:
function convertNative2xml( $var, $name='data' ){
    echo '<o:item key="' . $name . '">';
    if( is_scalar( $var ) ) echo $var;
    else foreach( $var as $n => $v ) convertNative2xml( $v, $n );
    echo "</o:$name>";
}
Так лучше:
1.02 - bench_xml
0.51 - bench_xml2

bench_xml2 изменил соответственно так:
PHP:
function bench_xml2()
{
  $data = array();
  for($n = 0; $n < 100; $n ++)
  {
    $data[$n] = $n;
  }
  convertNative2xml($data);
}
-~{}~ 14.01.08 17:46:

Автор оригинала: atv
Если бы ты сравнил страницу, сгенерированную по типу Symfony, и такую же страницу, полученную XSLT преобразованием, в которой содержался бы вывод дерева или таблицы по каким либо входным данным, вот тогда результат был бы интересным.
Если в Symfony компилируемые шаблоны, мне кажется, xslt будет в проигрыше по-любому (с точки зрения производительности).
 

dark-demon

d(^-^)b
не удивительно - писать в один буфер быстрее, чем жонглировать строками...

а если к результату прицепить xslt?
 

CatManZero

Новичок
Автор оригинала: dark-demon
не удивительно - писать в один буфер быстрее, чем жонглировать строками...

а если к результату прицепить xslt?
Давай уже сам ;)
Там сложного ничего нет. Пишешь функцию. Добавляешь в массив:
$funcs = array('bench_php', 'bench_xslt', 'bench_xml', 'bench_xml2');
И запускаешь...

Я врядли в ближайшее время буду использовать такие странные манипуляции с xml. Хотя результаты интересные...
 

atv

Новичок
Если в Symfony компилируемые шаблоны
Нет, там PHP используется как шаблонизатор, однако, чтобы добавить ему функциональности, активно используется инклюд, плюс назначение переменных по иерархии вложенных шаблонов.
 

CatManZero

Новичок
Автор оригинала: atv
Нет, там PHP используется как шаблонизатор, однако, чтобы добавить ему функциональности, активно используется инклюд, плюс назначение переменных по иерархии вложенных шаблонов.
Нафик, нафик. Сравнивать php и xslt... :)
А спорить, что лучше самопис, привязанный к конкретной платформе или стандарт, тем более не вижу смысла.
Я хоть уже почти 3 года использую xslt в качестве шаблонизатора и сделал уже порядка 20-ти сайтов на его основе, сам до конца не определился, что лучше.
И вот собираюсь для очередного проекта (не по основной работе) использовать {{MACRO}} из limb-а.
 
Сверху