Что быстрее: многие IFS, или иначе если?

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

22
задан ire_and_curses 23 September 2012 в 02:15
поделиться

9 ответов

Да, используйте else if, рассмотрите следующий код:

if(predicateA){
  //do Stuff
}
if(predicateB){
  // do more stuff
}

of

if(predicateA){
  //
}
else if(predicateB){
  //
}

во втором случае, если predicateA истинно, predicateB (и любые другие предикаты) не должны быть оценивается (и поэтому весь код будет выполняться быстрее), тогда как в первом примере, если predicateA истинно, predicateB всегда будет вычисляться, и вы также можете получить некоторые неожиданные сюрпризы, если predicateA и predicateB не являются взаимоисключающими.

46
ответ дан 29 November 2019 в 03:23
поделиться

You can have a look at phpbench

But to be honest if you want to optimize at this level, you might want to learn something else than php.

alt text

10
ответ дан 29 November 2019 в 03:23
поделиться

Если честно, я не думаю, что это будет иметь значение с точки зрения производительности, я сомневаюсь, что вы заметите какую-либо разницу. Я бы порекомендовал использовать оператор switch, который не улучшает производительность, а просто синтаксически лучше:

switch ($day) 
{
    case "Monday":
        // do something with Monday
        break;
    case "Tuesday":
        // do something with Tuesday
        break;
    case "Wednesday":
        // do something with Wednesday
        break;
}
8
ответ дан 29 November 2019 в 03:23
поделиться

else if будет быстрее в том смысле, что вы сравниваете, пока не достигнете условия, которое разрешается в true, и вы пропустите остальные if s.

Также рассмотрите возможность переупорядочения сравнений в порядке убывания частоты.

И использование оператора переключателя в зависимости от типа данных объекта, который вы сравниваете.

Однако на этом этапе, как у duffymo, предложили, вы будете микро-оптимизацию. Прирост производительности никогда не будет таким значительным, если вы сначала не выбрали правильный алгоритм сортировки для задания.

3
ответ дан 29 November 2019 в 03:23
поделиться

Если значения являются целыми числами, вы можете добиться оптимизации, используя поиск в таблице. Например, у вас есть 256 значений, которые каким-то образом сопоставляются с 7 днями, вы можете создать массив из 256 ячеек, и каждая ячейка будет содержать нужный вам день недели. Тогда вместо:


if ( value == 0 ) {
  dayofweek = 1;
} else if ( value == 1 ) {
  dayofweek = 2;
} else if ( value == 2 ) {
  dayofweek = 3;
} else if ...

.. вы могли бы иметь ..


dayofweek = lookuparray[value];

Конечно, если вы используете эту технику, тогда вы должны сначала проверить границы значения.

2
ответ дан 29 November 2019 в 03:23
поделиться

In general, "else if" style can be faster because in the series of ifs, every condition is checked one after the other; in an "else if" chain, once one condition is matched, the rest are bypassed.

The fastest would be a table dispatch, which is what a switch statement gets optimized into when there are enough cases in it (if there are few cases in a switch, it gets translated into a series of if-else checks in the resulting machine code).

0
ответ дан 29 November 2019 в 03:23
поделиться

The decision to use many if-statements or one if-elseif-elseif... should not rely on performance, since this decision involves the program flow massively.

I doubt that you can switch from many if-statements to a big if-elseif without loosing functionality.

Its a design question, not a perfomance one.

0
ответ дан 29 November 2019 в 03:23
поделиться

Я сомневаюсь, что такая микрооптимизация внесет ощутимые изменения в ваш код.

Ваш алгоритм сортировки, скорее всего, станет источником проблемы с производительностью. Какой алгоритм сортировки вы выберете, будет иметь решающее значение, не так много «если» по сравнению с «else if».

ОБНОВЛЕНИЕ:

Замечания, высказанные другими о том, что «else if» является лучшим выбором из-за его раннего выхода и исключительного логические характеристики, предполагают, что в этом случае его следует предпочесть «если».

Но точка зрения о выборе алгоритма все еще остается в силе - если только ваш набор данных не очень мал.

Очевидно, что O (log n) будет лучше, чем O (n ^ 2), но размер набора данных тоже имеет значение. Если у вас всего несколько элементов, вы можете не заметить разницы. В этом случае кодирование неэффективного метода самым чистым,

18
ответ дан 29 November 2019 в 03:23
поделиться

Я бы еще раз проголосовал за использование оператора switch ().

1
ответ дан 29 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: