За последние 24 часа нас посетили 49813 программистов и 1734 робота. Сейчас ищут 637 программистов ...

Как работает include внутри if/select

Тема в разделе "Прочие вопросы по PHP", создана пользователем astroworld, 11 июл 2017.

  1. astroworld

    astroworld Активный пользователь

    С нами с:
    30 авг 2008
    Сообщения:
    16
    Симпатии:
    2
    Доброго дня!
    Допустим есть код:

    Код (Text):
    1. if (условие)
    2. {
    3. много кода 1
    4. }
    5. else
    6. {
    7. много кода 2
    8. }
    Вот если вместо "много кода 1" и "много кода 2" использовать include из файлов, где будет прописан этот код- то в этом случае код загружается сразу при запуске основного скрипта из каждого файла или только в том случае, если выполняется какая-либо из веток?
    То есть реально ли сэкономить немного памяти, используя include в таких вот конструкциях, если каждая ветка довольно существенный алгоритм?
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Главное, не использовать двойные кавычки, так вы ещё и время сократите на сотую микросекунды!
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @astroworld
    не надо так делать.
    надо делать функции, классы и т.п.
    а их уже как-то разносить по файлам.

    вынос "длинного ифа" в отдельный файл не ускоряет, а замедляет выполнение.
    вынос же кода в функцию улучшает читаемость и упрощает поддержку. А то недайбожэ ты где-то не там фигурную скобку вкрячишь и заколебёшься искать потом.
     
    Fell-x27 нравится это.
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Наоборот, сборка большого проекта в один гигантский файл - это один из первых методов оптимизации скорости пхп.
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Вот вы все про микросекунды и скорость, а человек про память спросил :)
    Это же типичный 'time-mempry trade'. Либо быстро работает, но жрет память, либо не жрет память, но работает чуть медленнее, однако:

    1) php7 на старте сразу откусывает 2 мегабайта. Да. На всякий случай. Это тоже часть time-memory trade. Разрабы решили, что time дороже, что, в общем-то, правда, по этому память сразу кусают наперед. Если твое приложение использует менее 2 мегабайт, можешь вообще не париться на тему памяти.

    2) php, начиная где-то с 5.6, если мне память не изменяет, или чуть ли не с 5.4 комплектуется штатным аккселератором, он же оп-кэшер. По этому
    Не совсем актуально сегодня. После прогрева опкэша проект уже де факто собран, причем уже в интерпретированном состоянии. Монтирование точек инклуда из опкэша - почти бесплатная операция.

    Автор, Игорь вот все верно сказал - разделение нужно делать ради организации кода, а не ради оптимизации. Поверь наслово - если что и будет "тормозить", выполняясь 1 сотую секунды вместо 0.9 сотых - то это твой код. Запросы к БД, запросы к файловой системе (если мимо кэша накопителя пролетит, а тут не угадать), неоптимальные алгоритмы и решения - это вот все. И память жрать будет именно это, а не то, что у тебя в коде есть 200 строчек, которые не были использованы, потому что ветвление пошло не туда.

    В PHP ты не упрешься, поверь. Не нужно преждевременных оптимизаций вслепую, на авось. Оптимизировать надо в двух случаях:
    1) Когда ты точно знаешь, что это необходимо. Например, выбирая между одним крупным мультиинсертом в БД и десятком одиночных в цикле отдавай предпочтение одному крупному. Хотя, с приходом mysqlnd это тоже уже не так актуально. Ну или не настолько остро. Хотя все равно один мультиинсерт лучше.
    2) Когда ты прикрутил профайлер, нашел бутылочное горлышко в конкретном месте кода и пришел к выводу, что его нужно расширять. Но это нужно не всегда. Если у тебя есть какая-то сверхтяжелая операция, которая выполняется, грубо, три секунды, но не чаще пары раз в час - то вообще плевать. Три так три. Не фатально.

    Третьего не дано.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я просто помню, как недавно кое-кто спрашивал у меня, не будет ли оптимизацией производительности выносить в отдельные файлы даже однострочные ифы :D
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это какая-то сюрреалистичная крайность, обратная простынному коду.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    нет. наличие свежей версии пхп не гарантирует, что кешер включен. он просто стал предлагаться "от производителя", а не только сторонний.
    нет. включенность кешера не отменяет выгоды от склеивания тысяч мелких файлов в один файл. инклюд это не только файловая операция, но и еще кое-что затратное в организации scope.

    читайте оригинальную статью Котерова, она не устарела. проверяйте настройки. делайте свои тестовые замеры.
     
    Maputo нравится это.
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    По умолчанию он таки включен сейчас. То есть если руками его не потушил админ сервера, он должен работать искаропки. Хоть и есть вероятность, что какому-нибудь мейнтейнеру какого-нибудь репозитория в голову стрельнет, что дефолтная сборка должна работать иначе, да.

    Но стоит ли эта выгода в данном случае удобства поддержки? И перекрывает ли эта выгода издержки? Сдается мне, что оверхеды на скоупах в данном случае - это что-то типа 5 копеек сдачи с покупки спичечного коробка. Или это основная точка потери производительности? Даже учитывая, что разговор идет о безумных наносекундах, а не о чем-то, что стоит внимания.
     
  10. astroworld

    astroworld Активный пользователь

    С нами с:
    30 авг 2008
    Сообщения:
    16
    Симпатии:
    2
    Большое спасибо за ответы.
    Я так понял большого значения это все не имеет.
    Но если вот такая ситуация:
    условие, записанное в if выполняется лишь для 1 из 100 посетителей сайта, тогда стоит его в include засунуть или нет?
    Для остальных 99 никаких действий не требуется, просто продолжается загружаться страница...
    То есть, если я правильно понял, то все, что в include сразу не загружается и, если правильно понял, то тогда в таком случае как раз стоит его использовать?
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. не нужно.
    весь сайт и так при каждом запросе состоит из "сто нужных строк" и "мегабайт незаюзанного кода"
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    IMHO, нет. если нет готового инструмента по скукоживанию кучи файлов (как в Symfony), то и не надо.
    --- Добавлено ---
    буквально взять и вырезать кусок кода в отдельный файл это не очень хорошая идея. это стопудов создаст сложности в понимании и модификации. отдельным файлом должен становиться класс — логически завершенная структура с продуманным внешним интерфейсом.
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Если там 20 мегабайт кода в этой ветке, то да, стоит вытащить наружу. В остальных случаях - пофиг.

    Либо логически сгруппированный набор функций, в зависимости от стиля.