Previous Entry В избранное Поделиться Next Entry
Тест производительности XSLT как шаблонизатора
Гоблин
[info]ibnteo
Нашел в интернете тест производительности различных шаблонизаторов (lebowski-bench), и решил проверить как поведет себя XSLT. Тест проводился в Ubuntu 8.10, apache2, без акселератора.



Все тесты у меня не заработали, но это и не важно, будем сравнивать с теми тестам что сработали сразу, а это: PHP mess, PHP includes и Smarty.

XSLT теста в комплекте не было, и я написал его, причем решил проверить что быстрее, xsl:for-each, или xsl:apply-templates.

По ходу создания шаблона (делал по образцу простого php) нашел и устранил несколько ошибок в HTML разметке (не закрытые и лишние тэги).

Входные данные брал не из PHP файла с массивами (data.inc), а сделал аналогичный XML файл (data.xml).

Результаты тестирования:

$ ab -n1000 -c30

Сравниваемый параметр: Requests per second

php - 1670
php includes - 750
smarty - 320

XSLT foreach - 590
XSLT templates - 580

Чистый PHP всех кладет на лопатки, но там загружается лишь один файл, при использовании include скорость уже не намного выше чем у XSLT. Smarty оказался почти в два раза медленнее чем XSLT.
С небольшим отрывом xsl:for-each победил у xsl:apply-templates, поэтому не стоит полностью отказываться от xsl:for-each.

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


На приведенном графике XSLT будет на уровне 200 (ZPS off), занимая "золотую середину" из всех шаблонизаторов.

Исходники тестов: lebowski-bench-xslt.zip
Метки: ,

Многие не любят XSLT не из-за скорости, я считаю, и я уверен, что почти никто тесты производительности, как ты, не проводил. Всех не устраивает рекурсивная логика как в Prolog. Просто так на ней мыслить не получится (к примеру, если из плоского списка новостей, выгруженных из базы, потребуется сделать вложенный по годам и месяцам) - по-моему, нужна подготовка. Мол, язык не для людей и все такое - еще так говорят.

А xsl:for-each и xsl:apply-templates для меня разные по применению конструкции: если первой я передвигаюсь по осям в основном, то вторую я использую как рекурсивный спуск, зачастую передавая параметры - ведь этот элемент работает прежде всего с детьми контекстного узла. Я понимаю, что вроде как контрукции взаимозаменяемы, но к примеру, чтобы пройтись по всем тегам b, я лучше напишу xsl:for-each select="//b" - это как-то читабельней что ли.
Хотя я ожидал, что for-each быстрее будет - он вроде как больше на итерацию, чем на рекурсию похож и без параметров к тому-же. Кстати, на вакансиях яндека был этот вопрос: который из этих двух быстрее и почему?

Еще, говоря о тестах, нельзя забывать, что каким бы ни был быстрым РНР, его все равно на клинта не переложишь :-)

> Еще, говоря о тестах, нельзя забывать, что каким бы ни был быстрым РНР, его все равно на клинта не переложишь :-)

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

Рекурсия в XSLT очень быстрая, лучше применять ее чем работу с осями навигации. Мой конвертер abw2fb (из формата Abiword в FictionBook2) без рекурсии работал в сотни раз медленнее чем с оной (на больших файлах). Назначение программы - конвертация из плоской (похожей на HTML) структуры в древовидную, вместо <p style="Heading1"/> <p style="Heading2"/> и так далее нужно сделать дерево <section><section>. Наиболее быстрый метод - идти рекурсивно по одному тэгу в плоской структуре.

Еще добавил варианты по тестированию: XSLT с xsl:include и XSLT с предварительным преобразованием данных из исходного data.inc в XML.

XSLT array - 460
XSLT include - 510

Что не удивительно, множество XSLT файлов медленнее чем один, и преобразование Array to Dom работает медленнее чем парсинг XML файла.

P.S.: Архив с тестами обновлён.

всё-таки попробуйте потестировать с акселератором, без него в тестах исключительно академический интерес. про xslt - я автор этого бенча и бы хотел включить в него xslt - сложно ли переписать ваш тест (самый быстрый вариант) чтобы он использовал именно data.inc?

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

Выложил по той же ссылке тест, где добавлено наиболее быстрое пребразование через функцию SimpleXMLElement(), оно используется в тестах "XSLT simple" и "XSLT simple include".

Скорость по сравнению с "XSLT foreach" (590) конечно же снизилась:
XSLT simple - 480
XSLT simple include - 420

>>С небольшим отрывом xsl:for-each победил у xsl:apply-templates, поэтому не стоит полностью отказываться от xsl:for-each.


Потому что при apply-templates надо мало того, что сделать выборку , так еще и НАЙТИ нужный шаблон, среди всей той кучи шаблонов что существует для данного режима, причем чтобы выяснить что шаблон подходит, нужно ВЫПОЛНИТЬ операцию поиска соответствия для КАЖДОГО узла выборки.


Вы читаете журнал [info]ibnteo