C: Quel est le meilleur et le plus rapide pour concaténer des chaînes

Je suis actuellement concaténer des chaînes de caractères en c, en utilisant la strcat() fonction de string.h bibliothèque.

J'y ai pensé, et je suis arrivé à la conclusion qu'il doit être très cher fonction, comme avant qu'il commence à enchaîner, il a pour itérer sur le char tableau jusqu'à ce qu'il trouve le '\0' char.

Par exemple, si je concaténer la chaîne "horses" 1000 fois à l'aide d' strcat(), je vais devoir payer
(1 + 2 + 3 + ... + 1000) * strlen("horses") = (1000*1001)/2 * 6 = 3003000

J'ai pensé à la façon non standard, du maintien d'un nombre entier avec la longueur de chaîne, puis de les envoyer à strcat() le pointeur à la fin de la chaîne:

strcat(dest + dest_len, "string");

Dans ce cas, je vais payer seulement 1000 * strlen("horses") = 1000 * 6 = 6000.

6000 est beaucoup plus faible que 3003000, de sorte qu'il peut être très critique pour les performances si vous faites beaucoup de ces concaténations.

Est-il une norme plus moyen de le faire, c'est mieux que ma solution?

  • si vous en avez trop pour concaténer des chaînes, vous pouvez faire usage de snprintf(buf, len, "%s%s%s", str1, str2, str3)
  • Cela semble prématuré d'optimisation pour moi. Êtes-vous conscient de combien il est rapide à effectuer une itération sur les caractères dans une chaîne de caractères?
  • Si vous êtes le maintien de la longueur de la chaîne, alors vous êtes aussi faire la même chose..juste la différence est que vous le faites dans votre code, plutôt que de strcat() fait pour vous!
  • La différence est que strcat() besoins d'itérer la chaîne de destination (O(n)) pour trouver la fin de la chaîne, tout en conservant la longueur de la chaîne permet la même opération en constant O(1) fois
  • "la pensée sur la façon non standard, du maintien d'un nombre entier avec la longueur de chaîne, puis de les envoyer à strcat() le pointeur à la fin de la chaîne" : c'est en fait la façon dont Java mettre en œuvre la chaîne de l'objet (avec également un hash et le décalage de l'index)
  • que faire si votre chaîne est saisie de l'utilisateur?( ce qui arrive la plupart des cas!) Ensuite, vous ne pouvez pas demander à l'utilisateur de fournir la longueur!
  • Bien sûr, à un point dans le temps, vous devez trouver la longueur, le plus probable lors de l'initialisation d'un objet de type string. Mais d'autres opérations pourraient être plus rapide.
  • vous avez raison! mais ensuite, trouver la longueur de votre code va ajouter la même surcharge de temps même si vous enregistrez un certain temps dans strcat() en passant la longueur de la chaîne!
  • Sur une note de côté, vous voudrez peut-être regarder dans le Cordes de remplacement de Chaînes de caractères pour une approche complètement différente
  • Cela me rappelle de Joel Spolsky de l'article, Retour à la base, en particulier le bit sur Shlemiel l'algorithme du peintre.