Comment calculer la longueur d'une chaîne de caractères en C de manière efficace?
Comment calculer la longueur d'une chaîne de caractères en C efficacement (dans le temps)?
Droit maintenant, je suis en train de faire:
int calculate_length(char *string) {
int length = 0;
while (string[length] != 'int calculate_length(char *string) {
int length = 0;
while (string[length] != '\0') {
length++;
}
return length;
}
') {
length++;
}
return length;
}
Mais c'est très lent par rapport à strlen() par exemple, est-il un autre moyen de le faire?
Grâce.
EDIT: je travaille dans un autoportant de l'environnement, je ne suis pas autorisés à utiliser de lib externe, y compris "de la chaîne.h".
- Pourquoi ne pas utiliser strlen alors? Ou est-ce un exercice?
- Ce n'est pas un exercice, l'environnement dans lequel je travaille ne m'autorise pas à inclure d'autres "libs", y compris "de la chaîne.h" donc, je dois mettre en œuvre et vous voudriez qu'il soit aussi efficace que possible tout en étant maintainble.
- Vous souhaitez peut-être modifier votre message original de mentionner que vous êtes dans un autoportant de l'environnement.
- Prendre en compte le fait que le std bibliothèque peut aussi être compilé avec les optimisations du compilateur activé et que votre code n'est pas.
- Il y a d'excellentes réponses ici, mais gardez à l'esprit que c'est de la micro-optimisation, et non tous les programmeurs à comprendre l'utilisation et l'importance de la macro-optimisation. Voici un exemple de 40x speedup parfaitement OK-la recherche de code: stackoverflow.com/questions/926266/...
Vous devez vous connecter pour publier un commentaire.
De la Code source de FreeBSD:
Par rapport à ton code, c'est probablement ce cartes très bien pour une instruction assembleur, ce qui peut expliquer une grosse différence de performances.
strlen()
. Les chances sont, si quelqu'un avait trouvé une meilleure, plus rapide méthode générique, strlen aurait été remplacé par l'.Prendre un coup d'oeil au code source de strlen () de la libc standard. Fonctions dans les bibliothèques standards sont généralement hautement optimisé. Check it out ici (codé en assembleur) - c'est à partir de la GNU libc.
Prendre un coup d'oeil à GNU C library
strlen()
source.Il utilise un certain nombre de non-évident astuces pour gagner de la vitesse sans le déposer à l'assemblée, y compris:
etc.
Le plus simple est d'appeler
strlen()
. Sérieusement. C'est déjà optimisé par le compilateur et/ou de la bibliothèque vendeurs pour être aussi rapide que possible pour votre architecture.Une commune de l'optimisation est de supprimer la nécessité d'augmenter un compteur, et de calculer la longueur du pointeur:
C les chaînes sont intrinsèquement inefficace, il y a deux raisons pour l'utilisation de la ASCIZ convention:
La première de ces académique dans ce cas, puisque vous n'êtes pas à l'aide de la bibliothèque standard, la seconde est facilement vaincu par la création de fonctions ou macros qui fournissent des conversions de chaînes C plus efficace de la convention tels que Pascal cordes. Le point est que vous ne devez pas être un esclave de la convention C si vous n'êtes pas à l'aide de la bibliothèque C.
Encore une autre façon d'accélérer char de comptage est d'utiliser la vectorisation!
Voici un exemple de comment le faire avec le respect de l'UTF8-chaînes codées:
Encore plus rapide de caractères UTF-8 de comptage,
http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html
Sur les processeurs de type i386, libc souvent l'utilisation d'un ultra-version optimisée de
strlen
, souvent écrit en langage d'assemblage. Le papier "La Longueur De La Chaîne" explique comment ils fonctionnent.Ici est une version optimisée pour les OpenBSD. (Ils ont aussi un version portable.) Voici la la version de la GNU libc.
Certaines des réponses ci-dessus sont très bons, et c'est mon point de vue.
Il y a un mot-clé connu comme "le registre"
Lire ici: http://gustedt.wordpress.com/2010/08/17/a-common-misconsception-the-register-keyword/ et http://msdn.microsoft.com/en-us/library/482s4fy9(v=vs. 80).aspx
À partir du premier lien:
Ainsi, parfois, il peut y avoir des fluctuations de la performance. Personnellement, c'est un de mes fav implémentations, mais Sudhanshu et Andomar également fournir une bonne mise en œuvre 🙂
J'ai eu le même problème, et je l'ai résolu. La clé est la condition 2 de la boucle for:
Je n'ai pas trouvé mieux :
De base programme en C pour calculer la longueur de la chaîne.
Je ne suis pas tout à fait sûr de ce que vous voulez faire.
Vous voulez ré-écrire
strlen
afin de rendre votre code compatible avec la norme c-Bibliothèque, ou vous souhaitez gérer les chaînes de caractères.Dans le premier cas, je pense que tu ferais mieux d'utiliser directement les bibliothèques standard.
L'autre cas est intéressant : vous devriez jeter un oeil à la chaîne c++ de la classe, qui ont une mise en œuvre des traits de la stratégie permettant de créer rapidement des manipulations de très grandes chaînes de caractères).
char
tableaux et C-littéraux de chaîne. Cela ne fonctionne pas pour les pointeurs vers des chaînes de caractères.