Rechercher : dans
Par :

[C] performance de strcmp

Dernière réponse le 11 déc 2008 à 17:13:31 tinoeldorados, le 10 déc 2008 à 11:16:50 
 Signaler ce message aux modérateurs

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

Configuration: Linux Suse
Firefox 2.0.0.6

Meilleures réponses pour « [C] performance de strcmp » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
3D Secure / Verified by Visa / SecureCode: Qu'est-ce que c'est ? VoirDepuis octobre 2008, les banques et commerçants en ligne ont commencé à adopter le système 3DSecure pour les paiements sur Internet. Qu'est-ce que c'est ? 3DSecure est appelé "Verified by Visa" chez Visa, et "SecureCode" chez Mastercard. (Les logos...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...

1

kilian, le 10 déc 2008 à 11:59:49

Salut,

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. Le gâteau est un mensonge!

Répondre à kilian

2

kilian, le 10 déc 2008 à 12:05:15

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.... Le gâteau est un mensonge!

Répondre à kilian

3

loupius, le 10 déc 2008 à 14:25:17

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).

Répondre à loupius

4

Char Snipeur, le 10 déc 2008 à 17:00:45

--------------------------------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. Salutation !
Char Snipeur

Répondre à Char Snipeur

5

loupius, le 10 déc 2008 à 18:05:01

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;
}

Répondre à loupius

6

fiddy, le 10 déc 2008 à 18:08:53

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
Google is your friend

Répondre à fiddy

7

Char Snipeur, le 11 déc 2008 à 10:09:17

Pourquoi cette lenteur d'exécution alors ? Salutation !
Char Snipeur

Répondre à Char Snipeur

8

fiddy, le 11 déc 2008 à 14:57:05

Ca c'est une bonne question.
J'aimerais bien quand même voir le code en question. Car sur ma machine, il n'y a, pas de problèmes pour ça.
Si ça se trouve, le problème vient d'ailleurs.

Cdlt

Google is your friend

Répondre à fiddy

9

kilian, le 11 déc 2008 à 14:59:37

A priori il fait une comparaison sur deux sous chaines d'un ensemble de 4 Mo. Donc ya qu' à imaginer... Le gâteau est un mensonge!

Répondre à kilian

10

fiddy, le 11 déc 2008 à 15:11:32

Souvent l'erreur vient plus de l'utilisation dont on se sert des bibliothèques de des bibliothèques elles-même.
Pour ma part, j'ai fait un test sur ma machine, et il n'y a aucun problème même pour des chaînes de grands formats, voilà pourquoi je demande à voir le code.
Cdlt
Google is your friend

Répondre à fiddy

11

kilian, le 11 déc 2008 à 15:14:44

Cdlt toi-même! Le gâteau est un mensonge!

Répondre à kilian

12

fiddy, le 11 déc 2008 à 15:16:45

Pas bien d'insulter de Cdlt :p
Google is your friend

Répondre à fiddy

13

kilian, le 11 déc 2008 à 15:21:00

En plus tu le fais avec tout le monde... serait peut être temps de te calmer un peu... Le gâteau est un mensonge!

Répondre à kilian

14

fiddy, le 11 déc 2008 à 15:28:55

Remarque je préfère être insulté de Cdlt que de "le gâteau est un mensonge" :d
Google is your friend

Répondre à fiddy

15

kilian, le 11 déc 2008 à 15:52:28

Euh, tu sais combien j'ai reçu de plainte par mp de gens qui se sont fait insultés de "Google is your friend"? Le gâteau est un mensonge!

Répondre à kilian

16

Char Snipeur, le 11 déc 2008 à 16:39:35

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!" Salutation !
Char Snipeur

Répondre à Char Snipeur

17

 kilian, le 11 déc 2008 à 17:13:31

Strcmp parcoure toute les deux chaines pour la comparaison, c'est pour ça. Il ne répond pas qu'un simple oui ou non il répond un entier qui reflète un peu le résultat.

Pour "le gâteau est un mensonge", il faudrait que tu joues au jeu "Portal" ;-) Le gâteau est un mensonge!

Répondre à kilian
Collection CommentÇaMarche.net