Производительность: шаблон вызова по сравнению с применять-шаблоном

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

33
задан Mathias Müller 21 March 2014 в 16:10
поделиться

3 ответа

Как со всеми вопросами о производительности, ответ будет зависеть от Вашей конкретной конфигурации (в особенности процессор XSLT, который Вы используете), и вид обработки этого, Вы делаете.

<xsl:apply-templates> берет последовательность узлов и проходит их один за другим. Для каждого это определяет местоположение шаблона с самым высоким приоритетом, который соответствует узлу и вызывает его. Так <xsl:apply-templates> похож <xsl:for-each> с <xsl:choose> внутренняя часть, но более модульный.

Напротив, <xsl:call-template> вызывает шаблон по имени. Нет никакого изменения в узле контекста (никакой <xsl:for-each>) и никакой выбор относительно который шаблон использовать.

Так с точно теми же обстоятельствами, Вы могли бы предположить, что <xsl:call-template> будет быстрее, потому что это делает меньше работы. Но если Вы находитесь в ситуации, где или <xsl:apply-templates> или <xsl:call-template> мог использоваться, Вы, вероятно, собираетесь быть выполнением <xsl:for-each> и <xsl:choose> сами, в XSLT, а не процессоре, делающем ее для Вас, негласно. Таким образом в конце мое предположение это, что это будет, вероятно, балансировать. Но поскольку я говорю, что это во многом зависит от вида оптимизации, Ваш процессор поместил в место и точно какую обработку Вы делаете. Измерьте его и посмотрите.

Мои эмпирические правила о том, когда использовать соответствие шаблонам и когда использовать именованные шаблоны:

  • использование <xsl:apply-templates> и соответствие шаблонам, если Вы обрабатываете отдельные узлы для создания результата; используйте режимы, если конкретный узел должен быть обработан несколькими различными способами (такой как в оглавлении по сравнению с телом документа)
  • использование <xsl:call-template> и именованный шаблон при обработке чего-то другого, чем отдельный узел, такой как строки или числа или наборы узлов
  • (в XSLT 2.0) использование <xsl:function> при возврате атомарного значения или существующего узла
58
ответ дан 27 November 2019 в 18:00
поделиться

применять-шаблон и шаблон вызова не выполняют ту же задачу, сравнение производительности не действительно релевантно здесь. шаблон вызова берет шаблонное имя в качестве параметра, тогда как применять-шаблон берет выражение XPath. Применять-шаблон поэтому намного более мощен, так как Вы действительно не знаете, какой шаблон будет выполняться. Вы получите проблемы производительности при использовании сложных выражений XPath. Избегайте "//" в Ваших выражениях XPath, так как каждый узел Вашего входного документа будет оценен.

10
ответ дан 27 November 2019 в 18:00
поделиться

Это может зависеть от xml синтаксического анализатора, который Вы используете. Я ни за что не могу говорить кроме синтаксического анализатора.NET 2003 года, где я сделал некоторые неофициальные тесты производительности на нажатие по сравнению с получением по запросу код XSLT. Это подобно тому, что Вы спрашиваете: применять-шаблон = нажатие и шаблон вызова = получение по запросу. Я был убежден, что нажатие будет быстрее, но это не имело место. Это было о даже.

Жаль у меня нет точных тестов теперь. Я рекомендую испытать его с Вашим предпочтительным синтаксическим анализатором и вижу, существует ли какое-либо существенное различие. Моя ставка не будет.

4
ответ дан 27 November 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: