2015-07-07 2 views
2

Я хочу улучшить производительность моего xslt 2.0. Я использую saxon-sa 9.0.0.5 в качестве процессора xslt. С помощью профилирования я обнуллю в узкое место. Вот мое узкое место кусок кода извлекаетсяXslt соответствует улучшению производительности

<xsl:variable name="party" select="/drawdownInventoryAndEventNotification/party"/> - около 500 партий

<xsl:apply-templates select="$party[@id = ($abc/@id union $xyz)]"/> - объединение производит последовательность около 20k элементов. Сравнение этих 20k элементов с party @ id является причиной производительности.

Заранее благодарим за ваши ценные решения/обходные пути.

ответ

2

Попробуйте определить ключ <xsl:key name="party-by-id" match="/drawdownInventoryAndEventNotification/party" use="@id"/>, а затем заменить <xsl:apply-templates select="$party[@id = ($abc/@id union $xyz)]"/> на <xsl:apply-templates select="key('party-by-id', $abc/@id union $xyz)"/>.

+0

Спасибо @MartinHonnen. С вашим предложением я мог бы сократить общее время обработки от 30 минут до 3 минут. Огромный выигрыш ... – Jimmy

1

Использование ключа, предложенного @MartinHonnen, будет моей первой реакцией, и стоит попробовать, но возможно, что это может не сильно помочь, потому что (а) хотя Saxon-SA 9.0 давно, и мое воспоминание может я ошибаюсь, я думаю, что оптимизатор Saxon должен ввести ключ автоматически, и (б) проблема может заключаться в оценке объединения.

Есть много дубликатов в результате объединения? Если это так, использование отдельных значений() для устранения дубликатов может помочь.

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

+0

спасибо @MichaelKay за ваши входы. на самом деле результаты объединения уникальны. Как вам предложили, вводя ключ, я получил почти 90% производительности. – Jimmy