4

我正在使用 StringTemplate 从数据集中生成一些 xml 文件。有时我在数据集中有超过 100,000 条记录,这些记录由模板中的循环枚举。它非常慢(每次操作 15-20 秒),所以性能对我不利。

这是我如何使用 ST 呈现报告的示例:

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

StringTemplateWriter 是从 IStringTemplateWriter 派生的简单编写器类,没有缩进。

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

在深度调试中,我发现它递归地解析我的模板,如果出现故障(不知道到底是什么),它会抛出 NoViableAltException 异常以从堆栈深处返回到表面,所以我猜问题在于使用太多的尝试接球。

谷歌在这方面没有发现任何有用的东西。

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

4

2 回答 2

4

ST 使用 ANTLR 解析 ST 模板和组。如果您遇到语法错误,则您的模板有错误。所有赌注都是为了表现,因为它会为每个赌注抛出一个异常。ANTLR/ST 在这里没有错 ;) 特伦斯

于 2010-06-02T21:36:09.647 回答
0

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

于 2010-05-10T12:05:00.687 回答