Много ли операторов if снижает скорость рендеринга php? - PullRequest
8 голосов
/ 26 октября 2011

Мне было интересно, могут ли сложные структуры / else в моем PHP-коде быть плохим дизайнерским решением.Много ли операторов if заставляет PHP работать медленнее, загрузка сайта медленнее и т. Д.?

Это код: (я понятия не имею, как wordpress обрабатывает is_page и т. Д.)

<?php

if (is_page()) {
//
    if (is_page(122)) {
    //subscribe page
    echo "subscribe page";

    }

    elseif (is_page(1263)) {
    //photography course
    echo "photography course page";

    }

    elseif (is_page(array(210,184,128))) {
    //210 copyright policy, 184 privacy policy, 128 contact
    echo "this is either copyright policy, privacy or contact page!";
    //nothing happens here, we don't need social buttons on these pages.
    }

    elseif (is_page(array(379,71,7,45,124,8,105,175,9,125,110))) {
    //379 photo galleries, 71 car photos, 7 conceptual, 45 event photos, 124 fashion, 8 landscape, 105 misc, 175 journalism, 9 portrait, 125 street photography, 110 travel
    echo "gallery pages and albums";

    }

    else {
    //any other page
    echo "any other page";

    }
//
}

elseif (is_single()) {
//
    if (in_category(array(147,196,35))) {
    //147 car photography, 196 car wallpapers, 35 photo stories
    echo "photo posts";

    }
    else {
    //any other post
    echo "any other post";

    }
//
}

elseif (is_archive()) {
//
    //any category
    echo "this is archive template"

}
//
?>

Ответы [ 6 ]

13 голосов
/ 26 октября 2011

Неа. Фактически, в большинстве случаев это ускорит процесс (поскольку разрешено пропускать блоки кода).

Единственное время, когда большое количество операторов if замедлит его, - это если проверяемое условие требует обработки. Примером будет что-то вроде:

while (true)
{
    if (count($some_array) == 0) { break; }
    /* some other code */
}

Всякая итерация в цикле проверяет, если count($some_array) == 0. Это означает, что каждый проход, PHP должен идти и вручную count количество элементов в $some_array, потому что он мог измениться. Это также относится к условию остановки в цикле for. Это связано с тем, что цикл for всегда можно переписать как цикл while:

for ([INITIALIZER_ACTION]; [CONDITION]; [POST_ITERATION_ACTION]) { [CODE]; }

совпадает с ...

[INITIALIZER_ACTION];
while ([CONDITION]) { [CODE]; [POST_ITERATION_ACTION]; }

Если вы планируете объединить несколько операторов if в одно: не получайте никаких преимуществ. PHP делает короткое замыкание, что означает, что если он достигнет точки, когда он знает , каков будет результат, он пропустит все остальное.

Например, рассмотрим $a = 5; if ($a > 0 || $b > 100 || $c > 200) {}.
Как только PHP увидит, что условие $a > 0 выполнено, весь оператор преобразуется в true (из-за использования значений OR) и не потрудится проверить $b > 100 или $c > 200.

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

5 голосов
/ 26 октября 2011

Операторы if - это одни из самых дешевых операций с точки зрения производительности.

Однако , то, что вы положили в предложение if может быть очень медленным.

Например, if (true) { ... } будет необычайно быстрым, но один if (calculatePi()) { ... } будет проходить буквально навсегда. Сам по себе if настолько быстр, что вам никогда не придется беспокоиться об этом, и, кроме того, почти все остальное, что вы делаете, в любом случае включает в себя несколько if с, например, когда вы делаете for или while циклы или switch операторы. Все они по сути содержат if (один или несколько) внутри них.

Что касается дизайна, многие if могут сбивать с толку других разработчиков, в зависимости от того, что вы пишете и как написано. Иногда вам лучше использовать операторы switch / case или какой-либо другой рабочий процесс приложения, но, по правде говоря, куча if s, вероятно, будет работать быстрее, чем любая структура, которую вы можете придумать. Но принимайте это близко к сердцу, если ваша only забота - производительность. Проектирование программного обеспечения не , повторяю, не в первую очередь о производительности. Хороший дизайн программного обеспечения связан с другими аспектами, такими как удобство сопровождения, т. Е. Насколько легко читать и успешно обновлять код.

Короче говоря, если вы оптимизируете производительность, не пытайтесь уменьшить количество if с. Скорее сосредоточьтесь на том, о чем спрашивают if, или что происходит в зависимости от того, возвращают ли они true или false.

Надеюсь, это поможет.

4 голосов
/ 19 мая 2016

Я только что натолкнулся на очень интересную статью статьи от WPShout, которая использует очень человеческую аналогию, чтобы предложить нам разумнее кодировать, и почему глубоко вложенные операторы if { .. } могут ухудшить не только производительность, но итакже ремонтопригодность кода.Если логика ориентирована на производительность, без ненужных раздутых итерационных проверок, скорее всего, вы получите довольно хорошо организованный, отзывчивый и понятный код.

ПРИМЕР КОДА (извлечено из статьи)

«Давайте сделаем это конкретнее, посмотрев на два простых примера кода: сначала в стиле Bubble, а затем в стиле Gateway».

Bad: Bubble-Style

$is_first_thing_working = true;
$is_second_thing_working = true;
$is_third_thing_working = true;
$is_fourth_thing_working = true;

if( $is_first_thing_working === true ) {
    if( $is_second_thing_working === true ) {
        if( $is_third_thing_working === true ) {
            if( $is_fourth_thing_working === true ) {
                return 'Working properly!';
            }
            else {
                return 'Fourth thing broken.';
            }
        }
        else {
            return 'Third thing broken.';
        }
    }
    else {
        return 'Second thing broken.';
    }
}
else {
    return 'First thing broken.';
}

Хорошо: Gateway-Style

$is_first_thing_working = true;
$is_second_thing_working = true;
$is_third_thing_working = true;
$is_fourth_thing_working = true;

if( $is_first_thing_working !== true ) {
    return 'First thing broken.';
}

if( $is_second_thing_working !== true ) {
    return 'Second thing broken.';
}

if( $is_third_thing_working !== true ) {
    return 'Third thing broken.';
}

if( $is_fourth_thing_working !== true ) {
    return 'Fourth thing broken.';
}

return 'Working properly!';

ПРИМЕЧАНИЯ НА ПРИМЕРЕ

Разница между двумя кодамиприведенные выше фрагменты сводятся к ключевому различию:

Пузырьковый метод спрашивает, являются ли важные условия истинными, и запускает код, только если они истинны.

Метод шлюза спрашивает, являются ли важные условия ложными,и немедленно выдает инструкции по выходу для каждого условия, если оно ложно.

Пузырьковый метод вызывает вложение, потому что вы должны проверить «истина, истина, истина, истина» , прежде чем перейти к кодуты хочешь бежать.Каждая «истинная» проверка - это уровень вложенности - условие, в котором должен жить ваш код.

Метод шлюза не является вложенным: как видите,код никогда не бывает более чем одним слоем логики.Это потому, что как только данный шлюз пройден, мы можем полностью об этом забыть.Другими словами, поскольку мы не вышли после проверки $is_first_thing_working, мы автоматически знаем, что $is_first_thing_working равно true для остальной части кода.

"Этокак в реальной жизни: если вы сидите рядом со мной на уроке истории, я знаю, что вы человек, студент моей средней школы и т. д., иначе вы бы никогда не были в моем классе.Не нужно проверять. "

3 голосов
/ 26 октября 2011

Очень сложно, если структуры / else указывают на плохой дизайн в большинстве случаев.Вы можете лучше сосредоточиться на улучшении плохого дизайна, чем на оптимизации. преждевременная оптимизация - корень всего зла! .

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

0 голосов
/ 26 декабря 2017

В пути .. ДА .
Я говорю это, учитывая сценарий наихудшего случая, в данном случае очень большой модельный объект с множеством условий. Здесь код должен пройти все условные проверки, которые в конечном итоге замедляют код.
Условные операторы создают трудности для распараллеливания и векторизации, и длинный ряд IF-THEN также может вызывать пропуски кэша команд и другие эффекты. Но если это делает код более понятным, используйте его.

0 голосов
/ 08 марта 2013

Вопрос не в том, чтобы иметь слишком много операторов if else, а в 1) их порядке и 2) насколько эффективны ваши условия

1) Если статус else должен быть в порядке убывания вероятности условий,В моей конкретной таблице базы данных wp_posts 80% записей имеют post_status из "черновика", "в ожидании", "корзины" и т. Д., Но не "опубликовать".Около 40% записей имеют «пост» как post_type.Таким образом, не имеет смысла иметь

if ($post_type=="post"&&$post_status=="publish") {
    doA();
} elseif ($post_type!="post"&&post_status=="publish") {
    doB():
} elseif ($post_type=="post"&&post_status!="publish") {
    doC();
} else {
    doD();
}

, но он должен идти в обратном порядке

Относительно 2), схема базы данных WordPress предполагает, что in_category() будет медленным.Если вы пишете какой-то запрос самостоятельно и, конечно, это зависит от того, насколько эффективен ваш запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...