Самый быстрый / правильный способ упорядочения операторов if / else if - PullRequest
4 голосов
/ 31 августа 2011

Есть ли в PHP самый быстрый / правильный способ упорядочения операторов if / else if?Почему-то в моей голове мне нравится думать, что первое утверждение if должно быть ожидаемым «самым популярным» условием, за которым следует второе и т. Д. Но действительно ли это имеет значение?Существует ли влияние на скорость или время обработки, если второе условие является наиболее популярным (то есть система всегда должна считывать первое условие)

Пример:

if ("This is the most chosen condition" == $conditions)
{

}
else if ("This is the second most chosen condition" == $conditions)
{

}
else if ("This is the third most chosen condition" == $conditions)
{

}

Ответы [ 5 ]

6 голосов
/ 31 августа 2011

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

РЕДАКТИРОВАТЬ: Кроме того, учтите это:

Моя функция вернется с вероятностью 25%.Я предпочитаю писать:

if ( $chance25 )
    return;
else if ( $chance40 )
    doSomething();
else if ( $chance30 )
    doSomethingElse();
else if ( $chance5 )
    doSomethingElse2();

, а не:

if ( $chance40 )
    doSomething();
else if ( $chance30 )
    doSomethingElse();
else if ( $chance25 )
    return;
else if ( $chance5 )
    doSomethingElse2();

Это просто приятное упорядочение по функциональности ...

EDIT2:

Один размерне подходит всем.Если ваши условия - это методы, возвращающие логические значения, упорядочите их по скорости выполнения метода в сочетании с вероятностью.Я думаю, что на самом деле нет одного хорошего ответа, вам нужно адаптироваться.Например, если мой $ chance25 был заменен методом reallySlowMethodDoNotUseUnlessYouReallyHaveTo(), я бы обязательно проверил его последним.: D

3 голосов
/ 31 августа 2011

Я согласен с тем, что @Luchian. Ваше основное внимание должно быть читаемость кода

Вам следует профилировать приложение, прежде чем оптимизировать код. То, как вы заказываете свое состояние, сильно зависит от того, сколько времени потрачено на «каждое условие if».

Давайте рассмотрим пример:

         Execution time - %ge called
Case 1 - 50 seconds (80% of time)
Case 2 - 10 seconds (15% of time)
Case 3 - 1 second    (5% of time)

100 runs:

Order A (In the order of "how often a condition is executed")
Case 1, Case 2, Case 3 = (80 * 50) + (15 * 60) + (5 * 61) = 5205 seconds

Order B (In the order of "execution times")
Case 3, Case 2, Case 1 = (5 * 1) + (15 * 11) + (80 * 61) = 5050 seconds
1 голос
/ 31 августа 2011

Ваше приложение, вероятно, является веб-приложением (поскольку это наиболее популярное использование PHP), поэтому большую часть времени оно ожидает внешних ресурсов, таких как база данных, доступ к файлам или веб-сервисы. Если вы не делаете это в цикле, который выполняется тысячи раз, или в рекурсивном методе, на самом деле не имеет значения, какое условие идет первым. Стремитесь к коду, который легко читать.

0 голосов
/ 31 августа 2011

Если вы просто проверяете значение $conditions по нескольким возможным текстовым значениям, вместо if/else, используйте switch .

switch ($conditions) {
    case "This is the most chosen condition":
        // do stuff
        break;
    case "This is the second most chosen condition":
        // do stuff
        break;
    case "This is the third most chosen condition":
        // do stuff
        break;
    default:
        // do stuff
}

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

0 голосов
/ 31 августа 2011

зависит от ваших предпочтений операции

Вы можете захотеть активировать условие два, а не условие одно и наоборот

$value=25;

if ($value > 20)
{
$value=200;
}
else if ($value < 50)
{
$value=5;
}
...