Est-ce en utilisant un arraylist de caractères plus rapide pour effectuer concaténation de chaînes multiples?

StackOverflow https://stackoverflow.com/questions/1750811

  •  20-09-2019
  •  | 
  •  

Question

J'utilise le cadre de micro .Net de sorte que le StringBuilder n'est pas disponible.

J'ai vu un code de professionnels aptes à utiliser un Arraylist de caractères à concaténer et de construire des chaînes, par opposition à l'opérateur +. Ils construisent essentiellement un code managé StringBuilder.

Y at-il un avantage de performance à cela? Supposons que le nombre d'enchaînements sont supérieurs à 10 et les longueurs de chaîne sont également plus grand que 10.

Était-ce utile?

La solution

Non, ne pas utiliser un ArrayList des valeurs de char. Ce sera encadré chaque omble chevalier - la performance sera horrible, tout comme l'utilisation de la mémoire. (Taille d'une taille de référence + d'un caractère en boîte pour chaque caractère ... beurk!)

Utilisez un char[] interne et « redimensionner » il (créer un nouveau tableau et copier le contenu dans) lorsque vous avez besoin, peut-être doubler en taille chaque fois. (EDIT: Vous ne le redimensionner à la taille exacte dont vous avez besoin - vous commencer avec, disons, 16 caractères et continuer à doubler - les opérations ainsi la plupart Append ne pas doivent « redimensionner » la tableau).

C'est similaire à la façon dont fonctionne StringBuilder de toute façon. (Il est encore plus proche de la façon dont le StringBuilder Java fonctionne.)

Je vous suggère de construire réellement votre propre type de StringBuilder avec les membres les plus importants. Unité de test le diable hors de lui, et le profil le cas échéant.

Faites-moi savoir si vous voulez un petit exemple.

Autres conseils

La seule raison que l'utilisation d'un ArrayList de caractères pour construire une chaîne serait considérée comme si vous est performant le compare à quelque chose qui a vraiment mauvaise performance. Concaténer une énorme chaîne en utilisant + = serait un exemple de quelque chose qui aurait si mauvaise performance.

Vous pouvez faire la concaténation de chaîne beaucoup plus efficace si vous venez de concaténer en un plusieurs chaînes plus courtes au lieu d'une grande chaîne.

Ce code, par exemple:

string[] parts = new string[1000];
for (int i = 0; i < parts.Length; i++) {
  string part = String.Empty;
  for (int j=0; j < 100; j++) {
    part += "*";
  }
  parts[i] = part;
}
string result = String.Concat(parts);

est d'environ 450 fois plus rapide que ce code:

string result = string.Empty;
for (int i = 0; i < 100000; i++) {
  result += "*";
}

StringBuilder est encore plus rapide, mais il est seulement environ quatre fois plus rapide que le premier exemple. Ainsi, en utilisant des chaînes plus courtes, vous pouvez réduire le temps de 99,78%, et en utilisant un StringBuilder ne ferait que réduire un autre 0,16%.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top