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 例外をスローしてスタックの深さからサーフェスに戻ることがわかったので、問題はの使用にあると思いますトライキャッチスローが多すぎる。

Google は、これに関して何の役にも立ちませんでした。

主な質問: この例外の数を減らし (ST のコードを書き直すことを除く)、テンプレート レンダリングのパフォーマンスを向上させる方法は?

4

2 に答える 2

4

STはSTテンプレートとグループをANTLRで解析します。構文エラーが発生する場合は、テンプレートにエラーがあります。それぞれに例外がスローされるため、すべての賭けはパフォーマンスのためにオフになっています。ANTLR / STはここで過失ではありません;)テレンス

于 2010-06-02T21:36:09.647 に答える
0

NoViableAltExceptionはパーサーエラーのように聞こえます。なぜANTLRが使用されているのかはわかりませんが(同じ作者からのものを除いて)、私が思いつくことができる唯一の推測は、テンプレート言語自体がANTLRを使用して解析されているということです。テンプレートにエラーが含まれている可能性がありますか?とにかく、ANTLRのエラー処理は本当に遅いので(たとえば、例外を使用します)、それがおそらくテンプレートの拡張が遅い理由です。

于 2010-05-10T12:05:00.687 に答える