![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Хрипа |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 11.12.2006 Репутация: -6 Всего: нет |
Привет всем, вот такой меня мучает вопрос:
будет будет ли работать скрипт быстрей если постоянно почишать код через unset(); Надо ответ да или нет, если да то почему, если нет то почему нет ? Всем спасибо --------------------
<Вырезана, как не соответствующая правилам форума > |
|||
|
||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
нет.
потому что тебе не нужно об этом думать. |
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Зависит от конкретной ситуации. В случае, если в скрипте вы считываете файл (размер которого вы заранее не знаете) или формируете достаточно большой по объему массив, то желательно уничтожать эти переменные, когда они вам уже не нужны, т.к. есть вероятность что с ростом проекта не будет хватать памяти на выполнение скрипта (memory_limit).
-------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
mishaSL, скрипт не должен считывать большой файл или формировать "достаточно большой" массив. Это раз.
Делать ансет за сотую долю секунды до конца выпонения скрипта можно, но много ли в этом смысла? Это два. |
|||
|
||||
| mishaSL |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Бывают ситуации, когда без этого сложно обойтись. Или вы с этим тоже не согласитесь?
Вопрос не в сотой доли секунды, вопрос в общей нагрузке на сервер и ограничении памяти. Понятно дело, что так делать бессмысленно:
но в случае, если вы обрабатываете большой объем данных, уничтожение переменной желательно. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
||||||
|
|||||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
Я не думаю, что ансет хоть как-то повлияет на производительность системы и объем занимаемой памяти
Это сообщение отредактировал(а) GeneralElectric - 18.2.2008, 09:30 |
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
А я это знаю точно, т.к. сталкивался с этим не один раз. Лучше лишний раз перестраховаться в местах, где объем данных хранимый в переменной, может сильно меняться из-за каких-либо факторов, не зависящий на прямую от программиста. Чем потом в готовой проекте искать проблемные места. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
Если эта ситуация не единичная, разовая, а возникает при штатном обращении к сайту, то, разумеется, не соглашусь. В этом случае надо не ансеты делать, а вообще избавляться от вороча ния бегамайтами данных. А в единичных случаях погоды не сделает. |
|||
|
||||
| Хрипа |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 11.12.2006 Репутация: -6 Всего: нет |
mishaSL, я согласен ведь если бы он не нужен был его бы и небыло. )
--------------------
<Вырезана, как не соответствующая правилам форума > |
|||
|
||||
| A1ekcandr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 27.6.2007 Репутация: 1 Всего: 1 |
В любом случае после использования переменной ее лучше уничтожить, ведь каждая переменная жрет память, конечно в большинстве случаев не существенно, но писать unset() считается хорошим тоном.
зы: Лично я не использую |
|||
|
||||
| CyClon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: 3 Всего: 4 |
Практики нет, но по теоретический части скажу, что unset судя по всему полезно делать за сравнительно долгое время до окончания выполнения скрипта для более-менее больших данных (чтобы память ими не была занята долгое время), а так же перед тем, как получить новую порцию объемных данных (чтобы было меньше вероятности нехватки памяти).
Делать в конце скрипта смысла абсолютно никакого не имеет, после окончания работы вся память и так освобождается. Грубый пример скрипта, когда unset необходим:
|
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Ситуации, когда НАДО делать unset - очень специфичны. Не стоит забывать о том, что PHP сам следит за памятью и, если грамотно спланировать области видимости переменных, ничего удалять не потребуется. К примеру, если мы получаем выборку из БД, то она наверняка потребуется нам в отображении страницы - т.е. вплоть до самого конца работы скрипта(в хороших проектах отображение - последняя стадия). Если мы занимаемся работой с повторяющимся куском кода, то в этом же повторяющемся куске кода и следует делать все, что хотим, а не складывать там данные до востребования. На моем опыте unset был нужен, когда получался один массив, с ним производились какие-то действия, затем из него удалялись некоторые ключи и данный массив передавался в дальнейшую обработку. Это сообщение отредактировал(а) flashaa - 18.2.2008, 22:24 |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
Какой смысл надевать штаны через голову? unset() предназначен совсем не для этого. http://php.net/unset
Откуда такая информация, что unset() высвобождает память? Хотелось бы увидеть достоверный источник этой информации или хотя бы пример кода, где именно unset() высвободит хоть байт памяти. Естественно, про данные типа "ресурс" не в счет, они действительно могут занимать много памяти и за ними действительно надо следить (mysql_free_result(), fclose(), etc). |
|||
|
||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
sTa1kEr, я запусил код, который выводит memory_get_usage, создает толстую переменную, снова выводит память, ансетит переменную и опять выводит. Память возвращается.
Винда, 5.2.5 |
|||
|
||||
| sTa1kEr |
|
||||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
Странно, а top мне говорит совсем другое:
Или
Это сообщение отредактировал(а) sTa1kEr - 19.2.2008, 00:06 |
||||
|
|||||
| GeneralElectric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 797 Регистрация: 11.1.2008 Репутация: 13 Всего: 16 |
Ну вот как раз информация, показываемая в top - то есть использование памяти самим интерпретатором, а не исполняемым скриптом, может и не высвобождаться, это да.
|
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
А какой тогда смысл использовать unset() кроме как по прямому предназначению: разлинковки переменной, удаления элемента массива, статических переменных и прочего (где без unset() действительно не обойтись) Если памяти в системе больше не станет (хотя для глобальных переменных это может и будет иметь какой-то смыл, но это уже из другой оперы), а следовательно и общая производительность не увеличится, то какой смысл городить повсюду unset()? Это из серии бреда вроде "увеличение производительности за счет не использования интерполяции переменных в строке" или "for vs foreach" итд. PS Особенно забавно читать подобные вопросы у авторов, которые пишут что-то вроде
и после этого спрашивают, что быстрее echo или print... |
|||
|
||||
| Staind |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 17.12.2007 Где: Планета сокровищ Репутация: 2 Всего: 3 |
Вроде как $r - это только указатель. Там, по сути, ничего не содержится. Все берется из базы. Конечно, если потом взять и написать:
$r = mysql_fetch_assoc ($r) - тогда да, другой разговор. --------------------
Ничто так не раздражает человека, как просьба успокоиться |
|||
|
||||
| solenko |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 34 Всего: 67 |
да, $r -- только указател на объект, который собдержится в памяти вашего сервера и принадлежит процессу php.
Добавлено через 2 минуты и 54 секунды Вы же не на c пишете. Все равно память освобождает сборщик мусора, а не сами программисты. unset лишь разрешает ему эту память очистить. -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
| mishaSL |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
sTa1kEr, чтобы не было недопонимания объясню: unset - уничтожает переменную, но не высвобождает память используемую интерпретатором PHP, хотя для самого PHP эта память больше не используется скриптом, что позволяет не переживать за memory_limit. НО когда мы уничтожили переменную, память которую она занимала, возможна для повторного использования. Пример без unset:
Результат без unset:
Пример с использованием unset:
Результат с использованием unset:
sTa1kEr, я не пытаюсь сказать, что нужно везде использовать unset(). Я просто хочу обяснить, что если переменная занимает реально много памяти, то ее необходимо уничтожить. -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
||||||||||||
|
|||||||||||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
mishaSL, ясно, спасибо за разъяснения.
|
|||
|
||||
| mishaSL |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1046 Регистрация: 10.1.2007 Где: Санкт-Петербург Репутация: 19 Всего: 54 |
Всегда рад интересной беседе -------------------- Лучший способ научиться программированию - это посмотреть как это делают другие... |
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
MishaSL, спасибо
|
|||
|
||||
| Хрипа |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 11.12.2006 Репутация: -6 Всего: нет |
Всем спасибо за дисскусию очень приятно было слушать различные мнения. )
--------------------
<Вырезана, как не соответствующая правилам форума > |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |