2010-04-28 65 views
4

我正在使用StringTemplate从数据集生成一些xml文件。有时,我在模板中循环枚举的数据集中有超过100,000条记录。它非常慢(每次手术15-20秒),所以对我来说表现并不好。StringTemplate性能不佳

这是一个例子,我如何使用ST渲染报告:

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

StringTemplateWriter是IStringTemplateWriter衍生无压痕简单的作家级。

顺便说一句,在调试屏幕中我看到了很多这样奇怪的消息:在深
“类型‘antlr.NoViableAltException’的第一次机会异常出现在StringTemplate.DLL”

的调试我发现它递归地解析我的模板,如果失败了(不知道到底是什么),它会抛出NoViableAltException异常,从深层堆栈返回到表面,所以我猜测问题在于使用了太多的尝试-catch掷的。

谷歌发现没有用。

主要问题:如何减少这个数量的异常(除了重写ST代码)并提高模板渲染的性能?

回答

4

ST用ANTLR解析ST模板和组。如果您遇到语法错误,您的模板(S)有错误。所有投注均为表现不佳,因为每个投注都会引发异常。 ANTLR/ST在这里没有过错;) 特伦斯

+0

谢谢。我的模板在初始化期间不会给出任何错误(所以它们可以正常工作),但可能您是对的 - 问题在于模板中的一些小错误。因为有很多模板,所以很难找到原因。 – Genius 2010-06-03 12:29:01

0

NoViableAltException听起来像解析器错误。我不确定为什么ANTLR被使用(除了它们来自同一作者),但我能想到的唯一的猜测是模板语言本身使用ANTLR进行分析。也许模板包含错误?无论如何,ANTLR的错误处理非常缓慢(一方面,它使用例外),所以这可能就是为什么你的模板扩展很慢。

+0

是的,这似乎是ANTLR的糟糕表现。那么你有没有关于另一个性能更好的字符串模板引擎的建议?和thanx你的回应。 – Genius 2010-05-12 09:10:21

+0

为了澄清,我没有说StringTemplate很慢,只是ANTLR的默认错误处理程序实现很慢(也不是很有帮助)。我认为,一旦你解决了潜在的错误,你会注意到性能会提高很多。 – Krumelur 2010-05-12 09:57:41