J'ai un pour la boucle et ce que je fais, c'est ceci.
forloop ( loop 7000 times) { x += 2000_char_long_string; }
5 Réponses :
Utilisez un stringbuilder . Lorsque vous utilisez + = code> sur les chaînes, vous continuez à créer de nouvelles chaînes et continuez à localiser des blocs de mémoire plus gros et plus importants. C'est pourquoi l'opération est si lente. P> p>
Une amélioration serait de définir la capacité initiale également. Si vous allociez des chaînes de caractères 7000 * 2000, définissez la capacité initiale à 14000000 pour éviter la croissance répétée du tampon.
C # String Object est immuable, chaque fois que le contenu est modifié, un nouvel objet est créé et le nouveau contenu est copié. Utilisez StringBuilder à la place, il est fourni pour résoudre le problème à laquelle vous êtes confronté p>
Utilisation d'un StringBuilder code>, comme @ kobi référencé Vous pouvez toujours augmenter les performances en l'initialisation. Il semble que vous puissiez déterminer la taille finale de la chaîne code> code> à l'avance.
StringBuilder sb = new StringBuilder(7000*2000);
for(int i=0; i< 7000; i++){
sb.append(2000_char_long_string);
}
return sb.ToString();
Notez que même si vous ne savez pas quelle est la longueur exacte, faites-la de mieux. Overgessing n'ajoute pas de frais généraux (mémoire de côté) et même si vous sous-gardes, vous allez toujours allouer moins qu'avant.
Les manipulations de chaîne sont immuables. Il y aura une nouvelle chaîne créée à chaque fois le stmt x + = 2000_char_long_string; est exécuté. Par conséquent, comme suggéré par Kobi, vous devez utiliser une classe StringBuilder. p>
Cependant, dans votre cas, vous devez spécifier la capacité du constructeur StringBuilder. p>
Ceci est parce que, s'il n'est pas spécifié, la capacité par défaut de StringBuilder lors de la création est de 16. p>
Une fois cette capacité épuisée, elle créera un nouvel emplacement de mémoire contigu, copier tout le contenu du StringBuilder vers le nouvel emplacement et pointez l'instance sur le nouvel emplacement. Puisque vous êtes déjà conscient de la taille approximative, la chaîne finale serait (peut-être 7000 * 2000), vous pouvez spécifier la capacité en conséquence. P>
S'il vous plaît voir ma réponse à StringBuilder et capacité? Pour plus de détails. p>
Dans votre cas, il serait utile de spécifier la capacité de l'initialisation StringBuilder pour que votre code soit plus rapide et d'éviter les frais généraux en raison de la réaffectation de la mémoire dans StressBuilder. S'il vous plaît vérifier ma réponse ci-dessous.
Stringbuilder déplace la peinture peut! Joelonsoftware.com/articles/fog0000000319.html