2015-06-12 4 views
4

Я создаю Xsl stylehseet и придумал это (на мой взгляд нелогичное поведение):XPath производительность явный индекс фильтра

Это XPath:

/корень/элемент [1] [@ attr1 ! = '1' или @ attr2 = 'тест']

ПУТЬ медленнее, чем это XPath:

/корень/элемента [Count (preceding- родственный :: элемент) + 1 = 1) и (@ attr1! = '1' или @ attr2! = 'тест')]

У меня есть 50 образца XML и с первым XPath она занимает ~ 55sec.
Со вторым XPath требуется ~ 4 сек!

Я использую XslCompiledTransform (C# .NET 4.5).

Может кто-нибудь объяснить, почему первый XPath - это намного медленнее второго? Я всегда думал, что лучше использовать явный индексный фильтр.

Обновление: Некоторые образцы XML:

<?xml version="1.0" encoding="iso-8859-1"?> 
<root> 
<element attr2="test" attr1="1"> 
    <child>17</child> 
    <child>17</child> 
    <child>16</child> 
    ... 
    <child>3</child> 
    <child>2</child> 
    <child>1</child> 
</element> 
<element attr2="test2" attr1="2"> 
    <child/> 
    <child/> 
    <child/> 
    <child/> 
    <child/> 
    <child/> 
    <child/> 
    ... 
    <child/> 
</element> 
.... 
<element attr2="test21" attr1="21" /> 

Есть только как 20-25 элементов с п Чайлдс, но максимальная глубина 4 (/ корень/элемент/ребенок/anotherChild).

+0

Это, безусловно, удивительно. Но я бы не использовал слово «нелогично». Является ли число детей элемента под корнем очень большим? В этом случае возможно, что первое выражение смотрит на все элементы, а второе останавливается после первого совпадения (это выражение используется в контексте, где требуется только первое совпадение?) –

+0

Я добавил несколько примеров xml, возможно вы можете объяснить, почему XPath с явным фильтром намного медленнее, чем XPath, с count (before-sibling :: element). – Tony

+0

Извините, я не знаю внутренних компонентов процессора Microsoft XPath, поэтому я ничего не могу объяснить о его стратегии оптимизации. –

ответ

0

Я пришел к решению, которое я просто должен принять. Microsoft говорит https://support.microsoft.com/en-us/kb/815124:

Все версии MSXML версии 3.0 и более поздних, быстрее с явным индексом фильтра. Улучшение производительности зависит от положения элемента в дочернем списке родителя. Вместо того, чтобы использовать следующее:

/Child_Element

использовать следующее:

/Child_Element [1]

В моем случае, первый пример WAY быстрее, чем recommandation от Microsoft ,

Смежные вопросы