Доброго дня! Допустим есть код: Код (Text): if (условие) { много кода 1 } else { много кода 2 } Вот если вместо "много кода 1" и "много кода 2" использовать include из файлов, где будет прописан этот код- то в этом случае код загружается сразу при запуске основного скрипта из каждого файла или только в том случае, если выполняется какая-либо из веток? То есть реально ли сэкономить немного памяти, используя include в таких вот конструкциях, если каждая ветка довольно существенный алгоритм?
@astroworld не надо так делать. надо делать функции, классы и т.п. а их уже как-то разносить по файлам. вынос "длинного ифа" в отдельный файл не ускоряет, а замедляет выполнение. вынос же кода в функцию улучшает читаемость и упрощает поддержку. А то недайбожэ ты где-то не там фигурную скобку вкрячишь и заколебёшься искать потом.
Наоборот, сборка большого проекта в один гигантский файл - это один из первых методов оптимизации скорости пхп.
Вот вы все про микросекунды и скорость, а человек про память спросил Это же типичный '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) Когда ты прикрутил профайлер, нашел бутылочное горлышко в конкретном месте кода и пришел к выводу, что его нужно расширять. Но это нужно не всегда. Если у тебя есть какая-то сверхтяжелая операция, которая выполняется, грубо, три секунды, но не чаще пары раз в час - то вообще плевать. Три так три. Не фатально. Третьего не дано.
я просто помню, как недавно кое-кто спрашивал у меня, не будет ли оптимизацией производительности выносить в отдельные файлы даже однострочные ифы
нет. наличие свежей версии пхп не гарантирует, что кешер включен. он просто стал предлагаться "от производителя", а не только сторонний. нет. включенность кешера не отменяет выгоды от склеивания тысяч мелких файлов в один файл. инклюд это не только файловая операция, но и еще кое-что затратное в организации scope. читайте оригинальную статью Котерова, она не устарела. проверяйте настройки. делайте свои тестовые замеры.
По умолчанию он таки включен сейчас. То есть если руками его не потушил админ сервера, он должен работать искаропки. Хоть и есть вероятность, что какому-нибудь мейнтейнеру какого-нибудь репозитория в голову стрельнет, что дефолтная сборка должна работать иначе, да. Но стоит ли эта выгода в данном случае удобства поддержки? И перекрывает ли эта выгода издержки? Сдается мне, что оверхеды на скоупах в данном случае - это что-то типа 5 копеек сдачи с покупки спичечного коробка. Или это основная точка потери производительности? Даже учитывая, что разговор идет о безумных наносекундах, а не о чем-то, что стоит внимания.
Большое спасибо за ответы. Я так понял большого значения это все не имеет. Но если вот такая ситуация: условие, записанное в if выполняется лишь для 1 из 100 посетителей сайта, тогда стоит его в include засунуть или нет? Для остальных 99 никаких действий не требуется, просто продолжается загружаться страница... То есть, если я правильно понял, то все, что в include сразу не загружается и, если правильно понял, то тогда в таком случае как раз стоит его использовать?
нет. не нужно. весь сайт и так при каждом запросе состоит из "сто нужных строк" и "мегабайт незаюзанного кода"
IMHO, нет. если нет готового инструмента по скукоживанию кучи файлов (как в Symfony), то и не надо. --- Добавлено --- буквально взять и вырезать кусок кода в отдельный файл это не очень хорошая идея. это стопудов создаст сложности в понимании и модификации. отдельным файлом должен становиться класс — логически завершенная структура с продуманным внешним интерфейсом.
Если там 20 мегабайт кода в этой ветке, то да, стоит вытащить наружу. В остальных случаях - пофиг. Либо логически сгруппированный набор функций, в зависимости от стиля.