Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вложенный вызов функций


Автор: PROme 31.3.2005, 18:07
реализую очередную свою бредовую идею smile
возник вопрос: что будет работать эффективней, например такая конструкция с вложенным вызовом функций:

Код

$code=trim(substr($dat, strpos($dat, 'blablabla')));


или ее развернутый аналог, например:
Код

$pos=strpos($dat, 'blablabla');
$code=substr($dat, $pos);
$code=trim($code);


???

мне кажется что первый вариант должен выполняться быстрее, но будет хавать больше памяти... в общем, как лучше поступить, не подскажите?

Автор: Mal Hack 31.3.2005, 18:18
Цитата(PROme @ 31.3.2005, 19:07)
но будет хавать больше памяти...

Как раз наоборот.

Делай как тебе больше нравится. Это не принципиально.

Автор: IZ@TOP 31.3.2005, 18:36
Мне кажется что первый вариант намного быстрее будет работать. В принципе это можно даже проверить.

PS Большой плюс за первый вариант - краткость - сестра таланта.

Автор: PROme 31.3.2005, 20:16
Mal Hack, IZ@TOP просто мне приследовали следующие мысли:
если поглядеть, выгодит:

Код

trim(
 substr(
  strpos(
  )
 )
)


т.е. загружается трим, висит
затем вызывает субстр, висят уже и трим и субстр
затем субстр вызывает стрпос, висят все трое в памяти
затем это все по очереди закрывается

а во втором же случае - запустился-закончился, запустился-закончился...
в принципе, 3-4 уровня вложенности еще не страшно... а если более?

хотя кто его знает... по крайней мере мне так кажется...

Автор: ST_Falcon 4.4.2005, 11:22
мне тоже второй вариант больше нравится.
не люблю я длинные строки с кучей вложений... во первых запутаться просто, во вторых действительно памяти должно больше хавать.

Автор: Mal Hack 4.4.2005, 11:31
Во второйм варианте используется лишняя переменная, лишний раз присваивается значение переменной $code, и лишний раз $code передается в качестве параметра по сравнению с первым вариантом.
Поэтому, имхо, первый вариант уж точно памяти меньше кушает.
Могу, конечно и ошибаться, но по логике так...

Автор: PROme 4.4.2005, 14:09
Mal Hack ну, значение этой переменной можно и не присваивать, двууровневое вложение функций по-моему в любом случае не страшно
а по поводу лишней переменной, так, а как насчет того, что в первом варианте, в середине будут висеть в памяти все предшествующие функции - неизвестно еще сколько они хавают, явно больше одной переменной... мне так кажется

Автор: Ignat 4.4.2005, 14:21
Цитата(PROme @ 31.3.2005, 20:16)

т.е. загружается трим, висит
затем вызывает субстр, висят уже и трим и субстр
затем субстр вызывает стрпос, висят все трое в памяти
затем это все по очереди закрывается

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

Автор: PROme 4.4.2005, 15:22
Цитата
трим не запустится пока не будет рассчитан аргумент, substr тоже

да? тогда уже интересней smile
ну, а с другой стороны - ведь в php, если не указано явных переходов, выполняется строчка за строчкой, а тут же интерпритатор должен же как-то помнить, что нужно вернуться впоследствии к вызвавшей функци - тоже какие-то доп ресурсы smile

Цитата
все эти функции уже находятся в памяти

угу, но одно дело находятся, а другое - выполняются де-то... они ведь начинают для себя ресурсы жрать... так ведь?

ну ладно, всем спасибо за ответы smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)