Я создаю 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).
Это, безусловно, удивительно. Но я бы не использовал слово «нелогично». Является ли число детей элемента под корнем очень большим? В этом случае возможно, что первое выражение смотрит на все элементы, а второе останавливается после первого совпадения (это выражение используется в контексте, где требуется только первое совпадение?) –
Я добавил несколько примеров xml, возможно вы можете объяснить, почему XPath с явным фильтром намного медленнее, чем XPath, с count (before-sibling :: element). – Tony
Извините, я не знаю внутренних компонентов процессора Microsoft XPath, поэтому я ничего не могу объяснить о его стратегии оптимизации. –