2013-06-26 2 views
0

Мне интересно, было ли в некоторых ситуациях сравнение с меньшим количеством процессоров для сравнения строк, сравнивая символы напрямую, в отличие от использования strcmp.Использование strcmp для сравнения строк и сравнения символов напрямую

Для получения некоторой исходной информации, я кодирую на C во встроенной системе с небольшой вычислительной мощностью. Он должен читать входящую строку и выполнять определенные задачи в зависимости от того, что представляет собой входящая строка.

Говорите входящую строку: "BANANASingorethispartAPPLESignorethisalsoORANGES". Я хочу проверить, что BANANAS, APPLES и ORANGES присутствуют в точном месте. Мой код будет сделать это:

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

Или я мог бы сравнить символы непосредственно:

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

Использование strncopy + зЬгстр более элегантно, но из соображений производительности, было бы быстрее, чтобы просто сравнить символы напрямую ?

+3

Я считаю, что 'strcmp()' as 'strlen()' и т. Д. Optmized вам не беспокоиться об этом. –

+2

Если стандартная библиотека предоставляет вам такие возможности, как сравнение строк, вы всегда должны их выбирать. –

+2

Я считаю, что время, затрачиваемое на составление этого вопроса, гораздо важнее, чем выигрыш в производительности, который вы могли бы получить от принятия лучших из этих двух вариантов. –

ответ

2

Сравнение символов непосредственно довольно мерзкий и хрупкий код. В зависимости от компилятора и архитектуры его также может быть сложнее оптимизировать.

С другой стороны, ваша копия - это отходы - она ​​не делает ничего полезного.

Просто проверьте строка по крайней мере достаточно долго (или точно нужной длины, но любой способ не слишком короткий) и strncmp (или memcmp) его на месте.

#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

В вашем случае, вы должны лучше использовать memcmp(), чтобы избежать копирования данных:

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

По крайней мере, некоторые реализации memcmp() будет даже быстрее, чем сравнение полукокса по полукокса.