SsortingngBuilder utilise-t-il plus de mémoire que la concaténation de chaînes?

Je sais que l’avantage de performance évident de l’utilisation de SsortingngBuilder est en C #, mais à quoi ressemble la différence de mémoire?

SsortingngBuilder utilise-t-il plus de mémoire? et en passant, qu’est-ce que le constructeur de cordes fait différemment pour le rendre beaucoup plus rapide?

Réponse courte: SsortingngBuilder est approprié dans les cas où vous concaténez un nombre arbitraire de chaînes, que vous ne connaissez pas au moment de la compilation.

Si vous savez quelles chaînes vous combinez au moment de la compilation, SsortingngBuilder est fondamentalement inutile, car vous n’avez pas besoin de ses capacités de redimensionnement dynamic.

Exemple 1: vous souhaitez combiner “chat”, “chien” et “souris”. C’est exactement 11 caractères. Vous pouvez simplement allouer un tableau char[] de longueur 11 et le remplir avec les caractères de ces chaînes. C’est essentiellement ce ssortingng.Concat fait ssortingng.Concat .

Exemple 2: vous souhaitez joindre un nombre non spécifié de chaînes fournies par l’utilisateur à une seule chaîne. Étant donné que la quantité de données à concaténer est inconnue à l’avance, l’utilisation d’un SsortingngBuilder est appropriée dans ce cas.

SsortingngBuilder n’est pas nécessairement plus rapide. Je me souviens que si vous concatentez moins d’une douzaine de chaînes, la concaténation de chaînes (eiether via Ssortingng.Concat ou simple str1 + str2) est en réalité plus rapide. La raison en est que l’allocation et l’initialisation de SsortingngBuilder prennent réellement du temps.

Si SsortingngBuilder est plus rapide, c’est parce qu’il crée un tampon interne auquel il ajoute des chaînes. Si vous concaténez 20 chaînes, SsortingngBuilder ajoute simplement l’une après l’autre à sa mémoire tampon et renvoie finalement le résultat à la demande – via sa méthode ToSsortingng (). (Je suppose que la mémoire tampon est suffisante. Dans le cas contraire, SsortingngBuilder s’inquiète de la réallocation de la mémoire tampon et utilise des méthodes heuristiques pour éviter de la réallouer trop souvent.) Si vous concatentiez des chaînes, chaque chaîne concatterait une nouvelle chaîne de length (str1.Length + str2.Length) et copiez les première et deuxième chaînes en place. Cela entraîne beaucoup de recopies de chaînes.

 var result = str1 + str2 + str3 + ... + strN; 

Cela nécessitera des atsortingbutions N-1 et des opérations de copie N-1. Cela peut coûter très cher pour un grand N. De plus, notez que vous copiez le contenu de str1 N-1 fois. Une fois pour obtenir le résultat de str1 + str2. Puis encore pour obtenir le résultat de (str1 + str2) + str3. Avec SsortingngBuilder, chaque chaîne est copiée une seule fois dans le tampon interne, en supposant que le tampon est suffisamment grand pour contenir les chaînes individuelles.

Je pense que vous devriez vraiment lire ceci: La sortingste tragédie du théâtre de la micro-optimisation , votre réponse de SsortingngBuilder v / s Concat, après le saut