После checkout'а, нужно в корне проекта запустить скрипт:
$> git clone git://github.com/pasaran/xslt-speed-test.git
$> cd xslt-speed-test
$> ./genxml
Он сгенерит в папке xml
необходимые для тестов xml'и.
Можно или запустить на выполнение все тесты разом:
$> ./doall
Или же запустить конкретный тест:
$> cd apply-templates-vs-call-template
$> ../dotest
Результаты будут выведены в файлы results
в соответствующих папках.
Важно понимать, что все тесты очень зависят от среды исполнения. На разных машинах (даже с близкими версиями libxml/libxslt) могут быть противоположные результаты и выводы.
Закоммиченные результаты были сделаны на моем ноутбуке с Ubuntu 9.10, версии библиотек:
$> xsltproc --version
Using libxml 20705, libxslt 10124 and libexslt 813
xsltproc was compiled against libxml 20632, libxslt 10124 and libexslt 813
libxslt 10124 was compiled against libxml 20632
libexslt 813 was compiled against libxml 20632
Еще важно понимать, что тесты довольно таки синтетические, так что нельзя на них полностью полагаться. В реальной жизни (много шаблонов, сложный развесистый и неоднородный xml и т.д.) все намного сложнее. Это тема для будущих экспериментов. А это так, для затравки.
-
Большая часть времени тратится вовсе не на хождение по дереву, match/select и т.д., а тратится оно на ввод/вывод. А точнее на вывод в результирующее дерево.
-
...
-
Неймспейсы -- зло.
apply-templates-vs-apply-templates-with-namespaces -
call-template
выгоднее, чемapply-templates
.
apply-templates-vs-call-template -
Дефолтные шаблоны рулят. Самый быстрый способ вывести текстовую ноду --
apply-templates
на нее.
apply-templates-vs-value-of -
Атрибуты лучше создавать инлайном, а не через
xsl:atttribute
. А еще лучше сразу задавать их в xsl статически.
attribute-node-vs-inline-attribute -
choose
для выбора между двумя вариантами лучше не использовать.apply-templates
быстрее. При этом еще важный нюанс: вchoose
много времени тратится именно на сам выбор, а вapply-templates
на вывод результата.
choose-vs-apply-templates -
Копировать xml/html из исходного дерева лучше всего через
copy-of
.identity transform
в два с лишним раза дороже -- без необходимости не использовать.
copy-of-vs-identity-transform-vs-literal-result -
Пустой шаблон таки вызывается. И это чего-то стоит. При передаче параметра (даже в пустой шаблон) время тратится не на его передачу, а на прием. Т.е. если передавать параметр в шаблон, в котором нет
xsl:param
, то это ничего не стоит. А вот если есть, то это сразу ощутимо, даже если сам параметр в теле шаблона не используется.
empty-template-vs-default-template -
for-each
завсегда побьетapply-templates
. Причем с очень приличным отрывом.
for-each-vs-apply-templates -
Удивительно, но вызов функции быстрее, чем именованный шаблон. Важное замечание: тест сильно зависит от машины и окружения. На другой машине могут быть другие результаты.
function-vs-call-template-1-scalar, function-vs-call-template-2-xml. -
Невооруженным взглядом особой разницы между
xsl:include
иxsl:import
обнаружить не удалось. Видимо, требуются более сложные эксперименты.
include-vs-import -
Ключ дешевле строить по атрибуту, чем по вложенному элементу. Кроме того, чем короче xpath в match'е ключа, тем лучше. И в случае длинного xpath'а, лучше сделать его абсолютным, чем относительным.
key-by-something -
С ключом таки быстрее, чем без ключа. Чуда не случилось. В данном случае, выгоднее абсолютный путь в ключе. А короткий относительный путь просто неприемлимо долго считается. Вывод: думать надо всякий раз, основываясь на знании xml'я.
key-vs-select -
Невнятный тест. Ничего существенного не выявилось.
many-modes-vs-one-mode -
Один шаблон, в котором в match'е несколько нод через pipe или несколько одинаковых на каждую ноду? Без разницы.
match-sequence-vs-match-pipe -
Насколько дорого использовать
//
в match'е. Невнятно, но вроде бы не очень дорого.
match-with-double-slash -
concat
дешевле, чем несколькоvalue-of
.
[n-value-of-vs-value-of-concat](/pasaran/xslt-speed-test/tree/master/(n-value-of-vs-value-of-concat/) -
Один большой шаблон лучше, чем несколько маленькие.
one-big-template-vs-many-small-templates -
Похоже, что чем выше (в смысле стека вызова шаблонов) выводить что-нибудь в результирующее дерево, тем лучше.
output-in-seven-steps -
Лучше всего использовать
method="text"
. Если бы это было возможно всегда.
output-xml-vs-output-html-vs-output-text -
Можно, если осторожно, использовать
//
в select'е.
select-in-seven-steps -
Дешевле выбрать все, а ненужное занулить.
select-not-all-vs-match-not-all -
Самый быстрый способ выбрать все -- просто
apply-templates
. Потом через*
, потом через pipe.
select-star-vs-select-vs-select-pipe -
Два шаблона с предикатом стоят столько же, сколько и один с if'ом.
two-templates-vs-template-with-if -
Ключ строится только если он используется.
use-key-vs-define-key -
xsl:text
стоит дороже, чем просто текст.
xsl-text-vs-simple-text -
Ось parent дороже, чем child. Использовать осторожно.
parent-vs-child-axis -
Получить значение атрибута стоит дешевле, чем значение вложенного элемента.
value-of-id-vs-value-of-@id -
Непонятные результаты. Особенно вместе с
one-big-template-vs-many-small-templates
. Как же все-таки вложенность влияет на а) вывод и б) match/select? Пока что непонятно.
horizontal-vs-vertical