2009-12-08 6 views
3

Est-il préférable, du point de vue des performances, d'utiliser "Example1"? Je suppose que "Example2" créerait une nouvelle chaîne sur le tas à chaque itération tandis que "Example1" ne serait pas ....NET question de performance de la chaîne

Example1:

StringBuilder letsCount = new StringBuilder("Let's count! "); 
string sep = ", "; 
for(int i=; i< 100; i++) 
{ 
    letsCount.Append(i + sep); 
} 

Example2:

StringBuilder letsCount = new StringBuilder("Let's count! "); 
for(int i=; i< 100; i++) 
{ 
    letsCount.Append(i + ", "); 
} 
+0

+1 Pour moi d'exposer à une utilisation de StringBuilder je ne l'ai jamais vu avant ... la conversion automatique des non internes paramètres de chaîne à chaînes (si c'est la bonne façon de le décrire) ... (et cela ne semble pas documenté dans MSDN). – BillW

Répondre

12

Le .NET CLR est beaucoup plus intelligent que cela. Il "interns" littéraux chaîne de sorte qu'il n'y a qu'une seule instance.

Il est également intéressant de noter que si vous étiez vraiment préoccupé par la concaténation de chaînes, vous voudriez transformer le simple appel Append en deux appels supplémentaires. La réalité, cependant, est que les frais généraux de deux appels l'emportent probablement sur tout coût de concaténation mineur. Dans les deux cas, il est probablement presque incommensurable sauf dans des conditions très contrôlées.

+0

Je pense que vous devriez essayer, en utilisant un chronomètre, il est très bien mesurable, que l'utilisation d'un stringbuilder est déjà plus rapide à plus de 4-5 concaténations. –

+0

Je suis bien conscient des avantages de l'utilisation d'un stringbuilder pour plusieurs concaténations. Je parlais de la différence entre Append (i + sep) et Append (i); Append (sep); x 100. – Josh

+0

J'ai suivi votre conseil et l'ai fait. x100 - 0ms (72 ticks) vs 0ms (61 ticks), x100000 - 32ms (71 517 ticks) vs 26ms (58 870 ticks) – Josh

2

Ils sont identiques.

1

En fait, ce serait une façon de le faire beaucoup plus rapidement être

string letsCount = "Let's count! "; 
string[] numbers = new string[100]; 
for(int i=0; i< 100; i++) 
{ 
    numbers[i]=i+", "; 
} 
String.Join(letsCount, numbers); 

See here

+0

Très intéressant, merci pour le lien. Je vais devoir m'en souvenir dans le futur. Je serais curieux de voir ce graphique après il y avait 100 chaînes enchaînées ... –