2010-04-28 86 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