2013-06-26 1 views
0

Je me demande si dans certaines situations, il serait moins gourmand en processeur de comparer des chaînes en comparant directement des caractères, plutôt que d'utiliser strcmp.Utiliser strcmp pour comparer les chaînes et comparer les caractères directement

Pour certaines informations générales, je code en C dans un système embarqué avec peu de puissance de traitement. Il doit lire une chaîne entrante et effectuer certaines tâches en fonction de la chaîne entrante.

Dites que la chaîne entrante est "BANANASingorethispartAPPLESignorethisalsoORANGES". Je veux vérifier que BANANAS, APPLES, et ORANGES sont présents dans leurs emplacements exacts. Mon code ferait ceci:

input = "BANANASingorethispartAPPLESignorethisalsoORANGES"; 
char compare[100];   //array to hold input to be compared 
strncopy(compare,input,7); //copy "BANANAS" to compare 
compare[7] = "\0";   //terminate "BANANAS" 
if (strcmp(compare, "BANANAS") == 0){ 
    strncopy(compare,input[21],6); //copy "APPLES" to compare 
    compare[6] = "\0";    //terminate "APPLES" 
    if(strcmp(compare,"APPLES")==0){ 
     //repeat for "ORANGES" 
    } 
} 

Ou, je pourrais comparer directement les caractères:

input = "BANANASingorethispartAPPLESignorethisalsoORANGES"; 
if(input[0]=='B' && input[1]=='A' && input[2]=='N' && input[3]=='A' && input[4]=='N' && input[5]=='A' && input[6]=='S'){ 
    if(input[21]=='A' && input[22]=="P" <snipped>){ 
     if(input[30]=='O' <snipped>){ 
      //input string matches my condition! 
     } 
    } 
} 

à l'aide strncopy + strcmp est plus élégant, mais pour des raisons de performance, serait-il plus rapide de comparer simplement les caractères directement ?

+3

Je crois que 'strcmp()' comme 'strlen()', etc est optimisé pour que vous ne vous inquiétiez pas de cela. –

+2

Si la bibliothèque standard vous fournit des fonctionnalités telles que la comparaison de chaînes, vous devriez toujours préférer celles-ci. –

+2

Je crois que le temps que vous avez passé à écrire cette question est beaucoup plus important que le gain de performance que vous auriez à adopter le meilleur de ces deux options. –

Répondre

2

Comparer des caractères directement est un code assez vil et fragile. Selon le compilateur et l'architecture, il peut également être plus difficile à optimiser. D'autre part, votre copie est une perte - elle n'a rien d'utile.

juste vérifier la chaîne est au moins assez longtemps (ou exactement la bonne longueur, mais aucune façon pas trop court) et strncmp (ou memcmp) en place.

#define COMPARE(IN, OFF, SUB) memcmp(IN+OFF, SUB, sizeof(SUB)-1) 

input = "BANANASingorethispartAPPLESignorethisalsoORANGES"; 

if (COMPARE(input, 0, "BANANAS") == 0 && 
    COMPARE(input, 21, "APPLES") == 0 && 
    COMPARE(input, 40, "ORANGES") == 0)) 
{ 
2

Dans votre cas, vous devriez mieux utiliser memcmp() pour ne pas copier les données:

input = "BANANASingorethispartAPPLESignorethisalsoORANGES"; 
if (memcmp(input, "BANANAS", 7) == 0 && 
    memcmp(input+21, "APPLES", 6) == 0 && 
    memcmp(input+40, "ORANGES", 8) == 0 ) 
{ 
    // everything matches ... 
} 

Au moins certaines implémentations de memcmp() sera même plus rapide que la comparaison ombles par char.

Questions connexes