2010-04-28 3 views
4

Я использую StringTemplate для генерации некоторых xml-файлов из наборов данных. Иногда у меня есть более 100 000 записей в наборе данных, которые перечислены в шаблоне. Он идет очень медленно (15-20 секунд за операцию), поэтому производительность для меня не очень хороша.StringTemplate bad performance

Это пример того, как я использую ST, чтобы сделать отчет:

using (var sw = new StringWriter()) 
{ 
st.Write(new StringTemplateWriter(sw)); 
return sw.ToString(); 
} 

StringTemplateWriter является простым писателем-класс, производный от IStringTemplateWriter без отступа.

Кстати, на экране отладки я вижу много такого странного сообщения:
«Первый шанс исключение типа„antlr.NoViableAltException“произошел в StringTemplate.DLL»

в глубоком отладки, я обнаружил, что он рекурсивно анализирует мой шаблон и если что-то не удается (не знаю, что именно), он исключает исключение NoViableAltException для возврата из глубины стека обратно на поверхность, поэтому я думаю, что проблема заключается в использовании слишком много попыток -catch перекидных лет.

Google не нашел ничего полезного в этом вопросе.

Главный вопрос: как уменьшить это количество исключений (за исключением перезаписи кода ST) и улучшить производительность рендеринга шаблона?

ответ

4

ST анализирует ST шаблоны и группы с ANTLR. Если вы получаете синтаксические ошибки, ваш шаблон (ы) имеет ошибки. Все ставки отключены для производительности, поскольку они генерируют исключение для каждого из них. ANTLR/ST не виноват здесь;) Теренс

+0

спасибо. мои шаблоны не дают никаких ошибок во время инициализации (поэтому они работают правильно), но, вероятно, вы правы - проблема в некоторой незначительной ошибке в шаблонах. трудно найти причину, так как есть много шаблонов. – Genius

0

NoViableAltException звучит как ошибка парсера. Я не уверен, почему ANTLR используется (за исключением того, что они принадлежат одному автору), но единственное, что я могу придумать, это то, что сам язык шаблона анализируется с использованием ANTLR. Может быть, шаблон содержит ошибки? В любом случае обработка ошибок ANTLR очень медленная (например, она использует исключения), поэтому, вероятно, поэтому расширение шаблона происходит медленно.

+0

Да, это, по-видимому, плохое выполнение ANTLR. так ли у вас есть рекомендации относительно еще одного механизма строковых шаблонов с лучшей производительностью? и спасибо за ваш ответ. – Genius

+0

Просто, чтобы уточнить, я не сказал, что StringTemplate медленный, только то, что реализация ANTLR обработчика ошибок по умолчанию медленна (и не очень помогает). Я думаю, что после исправления основных ошибок вы заметите, что производительность значительно улучшится. – Krumelur