2010-04-28 8 views
4

J'utilise StringTemplate pour générer des fichiers xml à partir de jeux de données. Parfois, j'ai plus de 100 000 enregistrements dans l'ensemble de données qui est énuméré par une boucle dans un modèle. Ça va très lentement (15-20 secondes par opération) donc la performance n'est pas bonne pour moi.StringTemplate mauvaise performance

Voici un exemple que j'utilise ST pour rendre un rapport:

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

StringTemplateWriter est un simple écrivain classe dérivée de IStringTemplateWriter sans indentation.

Par ailleurs, dans l'écran de débogage, je vois beaucoup de ce message étrange:
"Une première chance exception du type 'antlr.NoViableAltException' a eu lieu dans StringTemplate.DLL"

dans une profonde de debug je trouve qu'il analyse récursivement mon template et si quelque chose échoue (je ne sais pas quoi exactement) il jette une exception NoViableAltException pour retourner d'un profond stack à une surface, donc je suppose que le problème est d'utiliser trop d'essayer -catch-throw.

Google n'a rien trouvé d'utile à ce sujet.

Question principale: comment réduire ce nombre d'exceptions (sauf réécrire le code de ST) et améliorer les performances du rendu de modèle?

Répondre

4

ST analyse les modèles ST et les groupes avec ANTLR. Si vous obtenez des erreurs de syntaxe, vos modèles ont des erreurs. Tous les paris sont désactivés pour les performances car il génère une exception pour chacun d'entre eux. ANTLR/ST pas en faute ici;) Terence

+0

merci. mes modèles ne donnent pas d'erreurs lors de l'initialisation (donc ils fonctionnent correctement), mais vous avez probablement raison - le problème est dans une erreur mineure dans les modèles. il est difficile de trouver la raison car il y a beaucoup de modèles. – Genius

0

NoViableAltException ressemble à une erreur d'analyseur. Je ne suis pas sûr de savoir pourquoi ANTLR est utilisé (sauf qu'ils proviennent du même auteur), mais la seule chose que je peux faire est que le langage de template lui-même est analysé en utilisant ANTLR. Peut-être que le modèle contient des erreurs? Quoi qu'il en soit, la gestion des erreurs d'ANTLR est vraiment lente (pour une raison, elle utilise des exceptions), c'est probablement la raison pour laquelle l'extension de votre template est lente.

+0

oui, cela semble être une mauvaise performance de ANTLR. alors avez-vous des recommandations sur un autre moteur de gabarit de chaîne avec de meilleures performances? et merci pour votre réponse. – Genius

+0

Juste pour clarifier, je n'ai pas dit que StringTemplate est lent, seulement que l'implémentation de gestionnaire d'erreur par défaut de ANTLR est lente (et pas très utile non plus). Je pense qu'une fois que vous aurez corrigé les erreurs sous-jacentes, vous remarquerez que les performances s'amélioreront beaucoup. – Krumelur