la façon la plus rapide de chaîne de remplacement dans un modèle
J'ai quelques modèles de chaîne
c'est mon {0} modèle {1} string
qui j'ai l'intention de mettre les valeurs de l'utilisateur à l'aide de String.Format()
.
La chaîne est en fait plus tellement pour des raisons de lisibilité j'utilise:
c'est mon {goodName1} modèle {goodName2} string
Et puis String.Replace
chaque paramètre et sa valeur.
Comment puis-je obtenir les meilleures performances et la lisibilité?
Peut-être que je ne devrais pas avoir ce modèle dans un fichier (comme maintenant), mais de créer de façon dynamique par concatanating à un générateur de chaîne et en ajoutant les paramètres lorsque nécessaire? Même si c'est moins lisible.
Quels sont mes autres options?
String.Replace
solution a un problème plus grave. Si le texte de remplacement contient également des sous-chaînes de la forme {goodNameN}
alors vont-ils être élargis ou pas? Il s'avère qu'il dépend de l'ordre dans lequel les remplacements sont effectués. C'est le genre de subtils flou que peut reposer à couvert pendant des années et puis morsure des voies mystérieuses de temps après le code est oublié.OriginalL'auteur Yaron Naveh | 2009-06-06
Vous devez vous connecter pour publier un commentaire.
De Atwood: C'. Juste. Ne fait pas. De la matière.
Parfois, il n'a vraiment d'importance... comme dans ce cas où les Remplacer a été accordée à partir de 20 secondes à 0,1... codeproject.com/Articles/298519/...
Atwood - il n'a pas d'importance, plus de 100 000 cycles. Plus de 200.000.000 de il pourrait.
OriginalL'auteur AgileJon
Vous pouvez mettre les paramètres dans un dictionnaire et d'utiliser le
Regex.Replace
méthode pour remplacer tous les paramètres en un seul remplacement. De cette façon, la méthode des échelles même si le modèle de chaîne est longue, ou le nombre de paramètres augmente.Exemple:
Et \{([^}]+)\} est plus rapide que l'utilisation de la non-greedy opérateur.
Une bonne note pour le point de sortie est
m.Value
devrait êtrem.Groups[1].Value
.m.Value
renvoie la même chose quem.Groups[0].Value
qui est l'ensemble de la partie correspondance.Oui, vous avez raison. J'ai corrigé le code.
plus difficile à lire, regex n'a pas de vitesse massif profit et le rend encore plus difficiles à lire le laisser seul script.
It just doesn't matter
- Je passé trop de temps à l'optimisation et l'obtention de 0,1 ms boost de vitesse. yay - et mon code était pire que le langage assembleur. chaîne de caractères.remplacer fonctionne très bien, est lisible et même les juniors comprendre. Mais elle ne doit jamais être utilisé dans d'énormes bouclesOriginalL'auteur Guffa
Comme pour tout, ça dépend. Si le code va être appelé pour des millions de fois chaque jour, alors pensez à la performance. Si c'est plusieurs fois par jour, puis aller pour des raisons de lisibilité.
J'ai fait une analyse comparative entre l'utilisation normale (immuable) les chaînes de caractères et StringBuilder. Jusqu'à ce que vous commencez à faire une quantité énorme en peu de temps, vous n'avez pas besoin de s'inquiéter trop.
OriginalL'auteur Iain Holder
Mon spontanée solution devrait ressembler à ceci:
J'ai utilisé ce genre de modèle de remplacement dans plusieurs projets réels et n'ont jamais trouvé que c'était un problème de performance. Car il est facile à utiliser et à comprendre, je n'ai pas vu aucune raison de changer beaucoup.
OriginalL'auteur Fredrik Mörk
MÉFIEZ-vous de s'enliser avec ce type de raisonnement.
À moins que ce code est en cours d'exécution des centaines de fois par minute, et le fichier de modèle est plusieurs K la taille, il est plus important de le faire. Ne perdez pas une minute penser à ce type de problèmes.
En général, si vous faites beaucoup avec les manipulations de chaînes, puis d'utiliser un générateur de chaîne.
Il a même un remplacement de la méthode.
Mais, pourquoi s'embêter. Lorsque vous avez terminé, et SI vous trouvez que vous avez un problème de performance, utilisez l'analyseur de performances et résoudre les VÉRITABLES goulets d'étranglement à l'époque.
OriginalL'auteur Bobby Ortiz
La même chose que ci-dessus que Fredrick posté ci-dessus, mais avec linq.
OriginalL'auteur jaxxbo
Si vous avez besoin d'un bon, rapide, mais le simple moteur de template, vous devriez vérifier StringTemplate. Pour de simples modèles qui ne nécessitent pas de toute logique ou de contrôle de flux dans le modèle lui-même, StringTemplate est GRANDE.
http://www.stringtemplate.org/download.html
OriginalL'auteur jrista
La plus rapide façon de le faire est avec un StringBuilder de l'utilisation des différents appels à
StringBuilder.Append()
, comme ceci:J'ai soigneusement comparé le cadre du code, et ce sera être plus rapide. Si vous voulez améliorer la lisibilité, vous pouvez garder une chaîne distincte de montrer à l'utilisateur, et de n'utiliser que ce en arrière-plan.
string result = "this is my " + UserVar1 + " template " + UserVar2 + " string"
Dans le cas où la performance et la lisibilité qui compte vraiment, c'est très peu probable que le modèle va être codé en dur dans le code. ne vois pas comment cela pourrait aider.
OriginalL'auteur Joel Coehoorn
Juste modifié la réponse ci-dessus à la suivante:
Méthode d'Extension:
Espère que cela aide.. 🙂
OriginalL'auteur Abhilash Shamsunder