Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как быстрее скрипт выполнится и не сожрет много памяти?

52K
15 августа 2010 года
lexandr
26 / / 16.07.2010
Допустим есть некая переменная $_GET[] в зависимости от нее будут выполняться блоки условия if else.

Код:
if()
{
какой то код
}
elseif()
{
какой то код
}
elseif()
{
какой то код
}

и т.д


Как будет быстрее? если я это "какой то код" оставлю прямо там в блоках или вынесу все эти "какие то коды" в отдельные файлы и в зависимости от переменной $_GET[] буду подключать через require_once()

примерно так:

Код:
if()
{
require_once()
}
elseif()
{
require_once()
}
elseif()
{
require_once()
}

и т.д


Или нет разницы вообще? Просто эти самые "какие то коды" очень объемные.
244
15 августа 2010 года
UAS
2.0K / / 19.07.2006
Поставьте перед условием и после всех условий microtime(), потом найдите их разницу - это будет время исполнения скрипта. Проведите n-ое кол-во испытаний каждым видным вам способом и оцените время выполнения.

Кол-во памяти измеряется через memory_get_peak_usage() (вроде эта команда, подбробнее в мане)

ЗЫ: по идее коды не должны быть такие объемные, видно, код у вас не структурирован.
253
15 августа 2010 года
Proger_XP
1.5K / / 07.08.2004
UAS прав, используйте microtime() и компанию, плюс профайлер (xdebug) на обоих вариантах - узнаете точно.

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

Последнее становится неактуальным, если на серваке стоит расширение типа XCache, которое избавляет PHP от парсинга одних и тех же скриптов при каждом запросе.
5
15 августа 2010 года
hardcase
4.5K / / 09.08.2005
Нужно оптимизировать алгоритмы а не языковые конструкции.
Для решения задачи за практически константное время (читать - время вычисления хэша от стороки в PHP) нужно сделать таблицу функций, ключом в которой станет возможное значение в _GET, а значением - функция обработчик.

З.Ы. Профит от таблицы будет заметен если ключей более ~20.
253
15 августа 2010 года
Proger_XP
1.5K / / 07.08.2004
Ещё проще сделать нечто вроде следующего, т.к. в таких ситуаций., как у автора, обработчик используется только в одном месте:
 
Код:
if (preg_match('/^[\w\d]+$/', $_GET['var'])) {
  require 'handlers/'. $_GET['var'] .'.php';
}
2
16 августа 2010 года
squirL
5.6K / / 13.08.2003
не думаю, что применение регулярок - хорошее решение. их вообще желательно применять исключительно по прямому назначению - поиск по шаблону.
444
16 августа 2010 года
patison
323 / / 15.03.2007
Такие конструкции - зло.
Первое что пришло в голову - это использовать ХОТЯ-БЫ switch/case:
 
Код:
switch( $_GET['myvar'] )
{
     case 'значение1': код ; break;
     case 'значение2': код; break;
     //и тд
}

Однако это тоже не лучший вариант.
Всё зависит от того что именно у вас там в GET-е, и Что вы с этим хотите делать.
253
16 августа 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: squirL
не думаю, что применение регулярок - хорошее решение. их вообще желательно применять исключительно по прямому назначению - поиск по шаблону.


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

Они относительно медленные, но всё же быстрее каких-то самодельных велосипедов (если нет стандартных функций). Проверка на число - понятно, is_numeric(). А как иначе проверить, например, имя файла при скачивании?

52K
18 августа 2010 года
lexandr
26 / / 16.07.2010
Что то я ступил, поспешил тему создавать. Пишу я админку. В ГЕТЕ должно было быть просто название модуля. Открыл админку в DLE, посмотрел как там сделано.
Буду юзать switch и require_once()
а модули просто в отдельную папку вынесу.
Хороший у вас форум, всегда ответы дают =) Спасибо.
253
18 августа 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: lexandr

Буду юзать switch и require_once()


Тогда уж массив имён модулей + один require_once.

Цитата: lexandr

Хороший у вас форум, всегда ответы дают =) Спасибо.


Заглядывай :)

244
19 августа 2010 года
UAS
2.0K / / 19.07.2006
Мой совет - require* только для подключения библиотек, но не для включения файлов в процесс.
Проще говоря, лучше уже писать все в одном файле, чем выносить по разным, т.к. тогда все логически лежит в одном месте. Переедавать имя модуля явно имхо неверно, хотя тут хз от привязки пути модуля к его физ.адресу. Главное, чтобы имя модуля не являлось его именем файла, имхо, так неверно, лучше использовать какие-то алиасы (в рамках CMS).

[COLOR="Silver"]P.S.: Написал бы ещё, да алкоголь вдает.[/COLOR]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог