[C] performance de strcmp
tinoeldorados
-
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je fais de nobreuse boucle de comparaison de chaine et j'ai des problemes de performance.
J'ai charge un texte 4mo dans un char *
je positionne des pointeurs (char *) dedans par coup de
position1 = &texte[i]
position2= &texte[j]
jusqu'a la aucun souci
mais quand je fais des strcmp sur position1 et position2
la fonction dure un temps fou... alors que les phrases sont differentes en moyenne en moins de 3 caracteres
et si dans texte je remplace '\n' poar '\0'
la meme fonction strcmp va beaucoup plus vite ...
comme si STRCMP faisait une copie des chaines avant la comparaison ???
Quelqu'un a t'il une idee
car j'ai besion de mes '\n' dans la suite et je trouve dommage de les substituer 2 fois
Je fais de nobreuse boucle de comparaison de chaine et j'ai des problemes de performance.
J'ai charge un texte 4mo dans un char *
je positionne des pointeurs (char *) dedans par coup de
position1 = &texte[i]
position2= &texte[j]
jusqu'a la aucun souci
mais quand je fais des strcmp sur position1 et position2
la fonction dure un temps fou... alors que les phrases sont differentes en moyenne en moins de 3 caracteres
et si dans texte je remplace '\n' poar '\0'
la meme fonction strcmp va beaucoup plus vite ...
comme si STRCMP faisait une copie des chaines avant la comparaison ???
Quelqu'un a t'il une idee
car j'ai besion de mes '\n' dans la suite et je trouve dommage de les substituer 2 fois
A voir également:
- [C] performance de strcmp
- Diagnostic de performance énergétique - Accueil - Maison
- Test performance pc - Guide
- Test performance pc gratuit - Accueil - Utilitaires
- Mode performance - Guide
- Optimiseur de performance pc gratuit - Accueil - Utilitaires
8 réponses
Salut,
Imagine cette chaine:
En gros tu es en train de partir du principe que strcmp s'arrête à la fin d'un mot, ou d'une ligne, mais non. Donc ce que tu fais n'a pas de sens.
Selon tes besoins, tu pourrais utiliser strncmp qui permet de limiter la comparaison au delà d'une certaine longueur.
Imagine cette chaine:
char *s = "Je suis une chaine mais bon ca va encore je suis pas trop grande, ceci dit je pourrais très bien faire Mo et continuer comme ça très longtemps....."; char *s1 = &s[3] ; char *s2 = &s[12]; if (!strcmp(s1, s2)) { /* N'arrivera jamais, tu es en train de comparer "suis une chaine mais bon ca va encore je suis pas trop grande, ceci dit je pourrais très bien faire Mo et continuer comme ça très longtemps....." avec "chaine mais bon ca va encore je suis pas trop grande, ceci dit je pourrais très bien faire Mo et continuer comme ça très longtemps....."
En gros tu es en train de partir du principe que strcmp s'arrête à la fin d'un mot, ou d'une ligne, mais non. Donc ce que tu fais n'a pas de sens.
Selon tes besoins, tu pourrais utiliser strncmp qui permet de limiter la comparaison au delà d'une certaine longueur.
Note qu'il me semble que strcmp est implémenté en assembleur dans la glibc, donc performances à gogo: à titre d'exemple, la comparaison de chaine sous x86 se fait en utilisant une seule instruction processeur (cmpsb).
A moins que ce soit gcc qui soit capable de transformer ça si bien en assembleur...sais plus....
A moins que ce soit gcc qui soit capable de transformer ça si bien en assembleur...sais plus....
Il est normal qu'en remplaçant les \n par \0, ça aille plus vite.
En effet, un \0 est une fin de chaîne, donc la comparaison s'arrête.
strcmp (comparaison de chaînes) compare des chaînes ---> donc s'arrête au premier \0 ou à la première différence (et renvoie d'ailleurs cette différence).
En effet, un \0 est une fin de chaîne, donc la comparaison s'arrête.
strcmp (comparaison de chaînes) compare des chaînes ---> donc s'arrête au premier \0 ou à la première différence (et renvoie d'ailleurs cette différence).
--------------------------------8 7.21.4 Comparison functions
> 1 The sign of a nonzero value returned by the comparison functions
> memcmp, strcmp, and strncmp is determined by the sign of the difference
> between the values of the first pair of characters (both interpreted as
> unsigned char) that differ in the objects being compared.
> -------------------------------->8-----------------------------------
>
> --------------------------------8 7.21.4.2 p3 The strcmp function returns an integer greater than, equal
> to, or less than zero, accordingly as the string pointed to by s1 is
> greater than, equal to, or less than the string pointed to by s2.
> -------------------------------->8-----------------------------------
C'est pas très clair, mais apparemment, strcmp cherche à comparer les longueur de chaîne, d'où l'éventuel longueur.
Mais si ça ne te conviens pas, tu peux toujours faire une fonction personnel qui irai plus vite retournant une valeur dès que deux caractères diffèrent.
> 1 The sign of a nonzero value returned by the comparison functions
> memcmp, strcmp, and strncmp is determined by the sign of the difference
> between the values of the first pair of characters (both interpreted as
> unsigned char) that differ in the objects being compared.
> -------------------------------->8-----------------------------------
>
> --------------------------------8 7.21.4.2 p3 The strcmp function returns an integer greater than, equal
> to, or less than zero, accordingly as the string pointed to by s1 is
> greater than, equal to, or less than the string pointed to by s2.
> -------------------------------->8-----------------------------------
C'est pas très clair, mais apparemment, strcmp cherche à comparer les longueur de chaîne, d'où l'éventuel longueur.
Mais si ça ne te conviens pas, tu peux toujours faire une fonction personnel qui irai plus vite retournant une valeur dès que deux caractères diffèrent.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Implémentation de cette fonction sur Linux:
/** * strcmp - Compare two strings * @cs: One string * @ct: Another string */ int strcmp (const char *cs, const char *ct) { signed char __res; while (1) { if ((__res = *cs - *ct++) != 0 || !*cs++) break; } return __res; }
Salut,
Non strcmp ne cherche pas à évaluer la longueur.
strcmp c'est une bébète boucle while tant que les caractères sont égaux.
Cdlt
Non strcmp ne cherche pas à évaluer la longueur.
strcmp c'est une bébète boucle while tant que les caractères sont égaux.
Cdlt
pourquoi cette lenteur d'exécution alors ?
pour en revenir au sujet, à moins d'avoir un texte étrange (avec plein de fois les mêmes caractère), et comme on ne passe qu'un pointeur, il n'y a pas de raison que cette fonction soit lente. Sauf copie, ou comparaison de longueur. Ou alors on ne nous dit pas tout sur la chaine à comparer.
Les deux gamins : direction le café, sinon ça va sévir ! ;)
Mais j'aimerai bien qu'on m'explique "Le gâteau est un mensonge!"
Les deux gamins : direction le café, sinon ça va sévir ! ;)
Mais j'aimerai bien qu'on m'explique "Le gâteau est un mensonge!"