Реальная скорость XSLT по сравнению с другими PHP-шаблонизаторами.

algo

To the stars!
Реальная скорость XSLT по сравнению с другими PHP-шаблонизаторами.

Очень хотелось как-то разобраться со скоростью XSLT сравнительно с другими php-шаблонизаторами.

Кто-то говорил что XSLT это жопа, кто-то указывал на С-экстеншн который наверняка очень быстр..

В общем, вот добавил в бенчмарк

http://test.country-info.ru/bench/

В XSLT я новичок, возможно, можно эффективнее сделать обработку ? А то уж больно результаты "не впечатляют".


P.S По исходникам, если решите скачать. XSLT-тест находится в сырцах в папке xslt, шаблон генерится автоматом по установкам теста - это test.html
 

slach

Новичок
весьма полезная ссылка

admin? а зачем без php-accelerator? IMHO с ним и надо мерять
потому что кому важна производительность тот и будет его юзать

вообще кстати такая вещь как заполнение XML'я... ее надо в бенчмарки кидать??

а в остальных темплейтах что мерялось??
assignVars и т.п. вещи измерялись для смарти ?

щас скачаем исходники... поглядим
 

algo

To the stars!
Я добавил время генерации XML, т.к обычно данные все же в массиве изначально. Например, из базы достаются..
 

slach

Новичок
вообще теоретически время генерации DOM документа можно было бы сократить если бы его нормально в php5 реализовали и была бы какая то возможность пихать его в memcached ...

само по себе XSLT преобразование попробуйте замерить?
и сравнить в процентном соотношении чтоже всетаки тормозит
преобразование или разбор данных

-~{}~ 06.09.05 14:36:

;)) я смотрю вы там чтото править пытаетесь??

надо еще поиграться например с параметрами row \ var

эффективнее и проще чем сделали вы... уже не сделаешь

можно было бы конечно усложнять шаблоны
и пытаться играть с логикой
но тот же php_templates ничего подобного не умеет
 

confguru

ExAdmin
Команда форума
N Engine name Time Percentage Checksum Test
php 0.002481 8460
php_templates 0.003591 8460
smarty 0.010279 8460
str_replace 0.009016 8460
phemplate 0.010936 8460
fasttemplate 0.017119 8460
madtemplate 0.01829 8460
ultratemplate 0.080635 8460
vtemplate 0.076134 8460
templatepower 0.035791 8460
phplib 0.087943 8460
xtemplate 0.112397 8460
bugitemplate 0.173707 8460
xslt 0.028306 8471
profTemplate 0.147126 8460
 

algo

To the stars!
Слач, DOMDocument представляет собой реальные данные. Здесь техника кэширования одна и та же для всех шаблонов.

Более того, можно кэшировать даже результат преобразования... Хотя XSLT под это изначально не "заточен", да ? В отличие, например, от Смарти..

P.S
Тест, разумеется, не принимает во внимание все разнообразие функциональности шаблонизаторов.
Это, как бы, другой параметр, в зависимости от которого делается конкретный выбор.
Мне хотелось увидеть реальную скорость..

Очень хотелось узнать, можно ли как-то оптимизировать работу с XSLT.. Кэширование шаблонов.. Даже не знаю..

Предполагается, что данные динамические..


P.P.S Все шаблонки кроме XSLT - староваты, может уж полгода им или даже чуть больше.

-~{}~ 06.09.05 12:50:

Интересные результаты с твоей, слач, подачи ;)!

Если прогнать все тесты с одной закоментированной строкой
$result = $xsl->transformToXML($xml);

(т.е преобразование исключить), то xslt занимает свое место в 5-ке сильнейших.

Но вот если его включить, то.. Вы все видите сами..
 

slach

Новичок
о ! значит тормозит именно преобразование...
причем преобразование простейшее...

что IMHO очень странно
и это либо какие то проблемы в реализации модуля XSL на php5, либо дейтсвительно тормоза идут изнутри libxslt ...

например ситуация как было с Sablotron и php4, сам по себе саблотрон преобразование делал не так уж медленно, НО
там на вход xslt_proccess две строки подавались XML и XSL
соответсвенно они внутри саблотрона уже в DOM дерево преобразовывались... и был существенный оверхед на этом, и xslt_proccess() казалась очень тормознутой

-~{}~ 06.09.05 15:39:

ну в реальности, перед подачей на xslt преобразование
кешируется XML строка (в файлах и в shared memory)
а лично очень хочется кешировать именно DOMDocument объект, чтобы его можно было кидать в http://php.net/manual/en/ref.apc.php или в http://ru.php.net/manual/en/ref.memcache.php

кешировать РЕЗУЛЬТАТ тоже не очень сложно

в принципе, через SRM можно реализовать попробовать Application Layer Objects... но SRM не включен в стандартную комплектацию php5 .. и вообще в достаточно жесткой альфе находится

вообще попробуйте еще в XSL шаблон добавить

<xsl:template match="/root">
<xsl:apply-templates select="block"/>
</xsl:template>
и вместо transformToXML поставить
transformToDoc
должно быть побыстрей, так мы проверим насколько тормозит сериализация в строку для transformToXML...
 

algo

To the stars!
<xsl:template match="/root">
<xsl:apply-templates select="block"/>
</xsl:template>
Некрасиво получается и вряд ли оно так поможет.

и вместо transformToXML поставить
transformToDoc
должно быть побыстрей, так мы проверим насколько тормозит сериализация в строку для transformToXML...
Оооо да!
Смотри на новые результаты. XSLT значительно ускорился.
Я заменил transformToXML на transformToDoc()->saveHTML()
И правда, проблемы с сериализацией.

Есть еще идеи по производительности ?
 

slach

Новичок
пофиксить можно, достаточно просто
<xsl:eek:utput method="xml" indent="no"/>

гхм... забавно =))
IMHO более правильно было бы
transformToDoc()->saveXML()
и было бы даже еще на крошки побыстрее

исходники обнови, пока там все по старому

-~{}~ 06.09.05 16:51:

<xsl:template match="/root">
<xsl:apply-templates select="block"/>
</xsl:template>
Некрасиво получается и вряд ли оно так поможет.
почему некрасиво??
как раз наоборот, то, что я привел это ИДЕОЛОГИЧЕСКИ правильно для XSLT процессора

вообще можно по разному изголяться например вот так

<xsl:template match="/root">
<xsl:apply-templates select="block"/>
</xsl:template>

<xsl:template match="block">
================
<xsl:apply-templates select="*" mode="vars"/>
</xsl:template>

<xsl:template match="*" mode="vars">
<br/><xsl:value-of select="."/><br/>
</xsl:template>

скажем вот такой еще вариант потестировать можно

-~{}~ 06.09.05 17:23:

я кстати потестил

xsltproc --timing recordset1.xsl recordset.xml > recordset.html
Parsing stylesheet recordset.xsl took 0 ms
Parsing document recordset.xml took 15 ms
Applying stylesheet took 63 ms
Saving result took 8828 ms
^^^^^^^^^^
ого =)

C:\usr\local\apache\htdocs\test.xslt\libxslt.bench>xsltproc --timing recordset2.xsl recordset.xml > recordset.html
Parsing stylesheet recordset2.xsl took 0 ms
Parsing document recordset.xml took 31 ms
Applying stylesheet took 62 ms
Saving result took 14813 ms

XML примерно такой
<?xml version="1.0"?>
<root>
<row>
<var0>var0</var0>
<var1>var1</var1>
<var2>var2</var2>
<var3>var3</var3>
<var4>var4</var4>
<var5>var5</var5>
<var6>var6</var6>
<var7>var7</var7>
<var8>var8</var8>
<var9>var9</var9>
</row>
...
500 элементов row

recordsed1.XSL вот такой
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="xml" indent="no"/>

<xsl:template match="/root">
<xsl:apply-templates select="row"/>
</xsl:template>

<xsl:template match="row">
================
<xsl:apply-templates select="*" mode="vars"/>
</xsl:template>

<xsl:template match="*" mode="vars">
<br/><xsl:value-of select="."/><br/>
</xsl:template>

</xsl:stylesheet>

recordset2.xsl вот такой
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:eek:utput method="xml" indent="no"/>

<xsl:template match="/root">
<xsl:apply-templates select="row"/>
</xsl:template>

<xsl:template match="row">
================
<br/><xsl:value-of select="var0"/><br/>
================
<br/><xsl:value-of select="var1"/><br/>
================
<br/><xsl:value-of select="var2"/><br/>
================
<br/><xsl:value-of select="var3"/><br/>
================
<br/><xsl:value-of select="var4"/><br/>
================
<br/><xsl:value-of select="var5"/><br/>
================
<br/><xsl:value-of select="var6"/><br/>
================
<br/><xsl:value-of select="var7"/><br/>
================
<br/><xsl:value-of select="var8"/><br/>
================
<br/><xsl:value-of select="var9"/><br/>
</xsl:template>


</xsl:stylesheet>
 

algo

To the stars!
Т.е мы сошлись на том. что само преобразование выполняется за приемлемое время, а вот с сохранением полный швах, так ?
 

slach

Новичок
угу... похоже на то, мой вариант с XSL шаблоном recordset1.xsl
тоже будет работать быстрее

по идее сериализация это рекурсия, в которой
количество итераций равно кол-ву NODES в результирующем дереве ну плюс проверки и дергание value и атрибутов и т.п.
т.е. чем меньше инфы на выходе тем быстрее сериализация получается =( c другой стороны, цикл от 1 до 5000 для Си, это же ерунда должна быть
 

fisher

накатила суть
у меня вопрос к algo: почему ты берешь такие нежизненные тесты?
они всегда лишь показывают время на очень простых задачах. то ест вот у тя крутится одна и та же по типу операция, насколько я понимаю процесс вообще один, у тя проц занят одним каким-то довольно простым делом. а как только ты сделаешь флуд на 100 процессов и посложнее адачу, которая работает с десятком шаблонов - ты получишь абсолютно другие результаты. здесь я кидал некие тесты, весьма любопытные имхо
http://www.livejournal.com/users/raa/54865.html#cutid1
 

slach

Новичок
фишер, ну почему не жизненные?

задачи простые, но распостранные задачи

тест на обычный recordset
т.е. фактически, взял выбрал из базы данные в Массив

потом тупо в цикле кинул их в шаблон
очень распостраненная задача, IMHO

человек старается померять МАКСИМАЛЬНО просто, без дополнительных "сторонних факторов"...

конечно можно потом усложнять и смотреть как оно там под нагрузкой живет

я надеюсь, что он при этом не делает однозначных выводов что php_templates однозначно медленее smarty или XSLT вообще гавно и с первыми двумя не может даже сравниваться =)
 

BeGe

Вождь Апачей, блин (c)
А давайте проверим цикл внутри шаблона... и условие... - вполне реальные задачи... сколько шаблонов просто - выйдут из тестирования ?
 

Bermuda

Новичок
BeGe
Есть мнение, что логика в шаблонах малоиспользуема. Нет, я не хочу сказать, что она нафиг там не упала, но практическое применение получает в малом количестве случаев. Более того, желательно перенести логику из шаблона во View. Это облегчает работу дизайнера, структуру шаблона, более верно распределяет ответственность между сущностями View и шаблон.
Таким образом, данный тест в контексте популярных задач (View парсит шаблон, а шаблон "шаблонит" :) является вполне корректным.
 

BeGe

Вождь Апачей, блин (c)
Bermuda - те примеры что я привёл в Smarty и XSLT используется очень часто. Особеноо для показа рекордсета.
Если не сипользовать логику в шаблонах, зачем Вы тогда выбрали эту технологию для использвания шаблонов ?
 

Bermuda

Новичок
Автор оригинала: BeGe
примеры что я привёл в Smarty и XSLT используется очень часто.
Очень часто и большинство случаев это разные вещи. Очень часто люди страдают умственными растройствами. Особенно на старости лет. Продолжим аналогию? :)
 

algo

To the stars!
Я согласен, что можно расширить параметры теста в сторону включаемых шаблонов, многопроцессности и прочего приближения к реальным задачам..

Получаемые результаты будут точнее, но довольно сомнительно, что они будут прямо-таки совсем другие.

Навороты шаблонизаторов не использовались, использовался тот функционал, который на каждой странице есть и его много.
То есть, "типичная задача", "типичный сферический конь в вакууме".

Насколько эта задача близка к вашей и как они изменятся в конкретно вашей ситуации - можно прикинуть, исходя из текущих результатов... Сделать дополнительные тесты и из нескольких тестов составить общую картину, вместо одного большого.

Мне лично эти тесты дали информацию актуальную и полезную.
 
Сверху