【问题标题】:StringTemplate bad performanceStringTemplate 性能不佳
【发布时间】:2011-02-13 08:22:38
【问题描述】:

我正在使用 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' 类型的第一次机会异常” p>

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

Google 没有发现任何有用的信息。

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

【问题讨论】:

    标签: c# stringtemplate


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我的模板在初始化期间没有给出任何错误(因此它们可以正常工作),但您可能是对的 - 问题在于模板中的一些小错误。由于模板很多,很难找到原因。
    【解决方案2】:

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

    【讨论】:

    • 是的,这似乎是 ANTLR 的糟糕表现。那么您对另一个性能更好的字符串模板引擎有什么建议吗?感谢您的回复。
    • 澄清一下,我并没有说 StringTemplate 很慢,只是说 ANTLR 的默认错误处理程序实现很慢(也不是很有帮助)。我认为一旦你修复了潜在的错误,你会发现性能会提高很多。
    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2016-11-06
    • 2019-06-15
    • 2013-06-11
    • 2010-12-31
    • 2012-01-25
    • 2021-12-15
    • 2011-01-14
    相关资源
    最近更新 更多