2015-01-21 3 views
0

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

В том числе мой код здесь:

Код 1:

for (i = 1; i < file_cnt;) 
{ 
    if ((strncmp(info[i-1].name, "1", 1) == 0) && 
     (strncmp(info[i].name, "2", 1) == 0)) 
    { 
    to do.... 
    i += 2; 
    } 
    else if ((strncmp(info[i-1].name, "2", 1) == 0) && 
      (strncmp(info[i].name, "1", 1) == 0)) 
    { 
    to do.... 
    i += 2; 
    } 
    ... 
} 

Код 2:

for (i = 1; i < file_cnt;) 
{ 
    if (strncmp(info[i-1].name, "1", 1) == 0) 
    { 
    if (strncmp(info[i].name, "2", 1) == 0) 
    { 
     to do.... 
     i += 2; 
    } 
    } 
    else if (strncmp(info[i-1].name, "2", 1) == 0) 
    { 
    if (strncmp(info[i].name, "1", 1) == 0) 
    { 
     to do.... 
     i += 2; 
    } 
    } 
    ... 
} 

Здесь Code 2 занимает сравнительно больше времени, чем Code 1. Я работаю с кросс-платформенным устройством и запускаю Code 2, что вызывает множество проблем с другими частями моего кода.

Почему это сравнение двух операторов занимает больше времени, чем сравнение одного оператора?

+1

Какой компилятор вы используете? У вас есть оптимизация? Кроме того, зачем использовать 'strncmp()' для сравнения только одного символа? Вы можете просто сравнить 'char' напрямую. –

+6

Возможно, вы можете сделать это даже «быстрее», если вы * не * используете 'strncmp'. Поскольку вы сравниваете только два символа (не забудьте о терминаторе строк), вы можете сделать e, g, 'if (info [i - 1] .name [0] == '2' && info [i - 1 ] .name [1] == '\ 0') ... ' –

+9

Также обратите внимание, что два фрагмента кода являются * not * равнозначными. В первом фрагменте кода, если второй 'strncmp' в первом' if' является ложным, код переходит в 'else', который, если оба сравнения истинны, вы выполняете в нем код (например,' i + = 2'. Однако во втором фрагменте кода, если первый внешний 'if' является истинным, а первое вложенное условие' if' является ложным, вы *** не *** переходите к 'else'. –

ответ

1

В коде 1 вы используете оператор &&. Особенность заключается в том, что он не оценивает второе выражение, если первое выражение (LHS) оказывается ложным. Это называется оценкой короткого замыкания. Поэтому, если ваше первое выражение в коде 1 неверно, оно напрямую переходит в else.

Кроме того, ваш вложенный Условный оператор будет генерировать дополнительный кадр стека, который замедлит программу (код 2)

+4

Теоретически не отличается от второго фрагмента кода, где, если выражение во внешнем 'if' является ложным, тогда второе (вложенное) сравнение не произойдет, и код перейдет прямо к' else'. –

+1

То же самое относится и к коду 2? т.е. если первый оператор «if» является ложным, тогда он не будет оценивать второе выражение «if» внутри него и переходит в условие else. –

+0

Хотя я знаю короткую оценку в течение многих лет, она все равно иногда укусит меня в крупу, если я забуду думать об этом. Совсем недавно операция повторяется фиксированное количество раз и в конце регистрируется количество попыток; цикл повторения был похож на 'do {...}, в то время как (! operation_successful && (++ try_count)