Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация, unset(); очистка 
V
    Опции темы
Хрипа
Дата 18.2.2008, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: -6
Всего: нет



Привет всем, вот такой меня мучает вопрос:
будет будет ли работать скрипт быстрей если постоянно почишать код через unset();
Надо ответ да или нет, если да то почему, если нет то почему нет ? 
Всем спасибо   smile 
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
GeneralElectric
Дата 18.2.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



нет.
потому что тебе не нужно об этом думать.
PM MAIL   Вверх
mishaSL
Дата 18.2.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Зависит от конкретной ситуации. В случае, если в скрипте вы считываете файл (размер которого вы заранее не знаете) или формируете достаточно большой по объему массив, то желательно уничтожать эти переменные, когда они вам уже не нужны, т.к. есть вероятность что с ростом проекта не будет хватать памяти на выполнение скрипта (memory_limit).


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
GeneralElectric
Дата 18.2.2008, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



mishaSL, скрипт не должен считывать большой файл или формировать "достаточно большой" массив. Это раз.
Делать ансет за сотую долю секунды до конца выпонения скрипта можно, но много ли в этом смысла? Это два.
PM MAIL   Вверх
mishaSL
Дата 18.2.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Цитата(GeneralElectric @  18.2.2008,  09:12 Найти цитируемый пост)
скрипт не должен считывать большой файл или формировать "достаточно большой" массив. Это раз.

Бывают ситуации, когда без этого сложно обойтись. Или вы с этим тоже не согласитесь?

Цитата(GeneralElectric @  18.2.2008,  09:12 Найти цитируемый пост)
Делать ансет за сотую долю секунды до конца выпонения скрипта можно, но много ли в этом смысла? Это два. 

Вопрос не в сотой доли секунды, вопрос в общей нагрузке на сервер и ограничении памяти. 
Понятно дело, что так делать бессмысленно:
Код

for($i=1;$i<100;$i++) {
    $data .= 'data ';
}
unset($i);

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



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
GeneralElectric
Дата 18.2.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



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

Это сообщение отредактировал(а) GeneralElectric - 18.2.2008, 09:30
PM MAIL   Вверх
mishaSL
Дата 18.2.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Цитата(GeneralElectric @  18.2.2008,  09:29 Найти цитируемый пост)
Я не думаю, что ансет хоть как-то повлияет на производительность системы и объем занимаемой памяти

А я это знаю точно, т.к. сталкивался с этим не один раз. Лучше лишний раз перестраховаться в местах, где объем данных хранимый в переменной, может сильно меняться из-за каких-либо факторов, не зависящий на прямую от программиста. Чем потом в готовой проекте искать проблемные места.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
GeneralElectric
Дата 18.2.2008, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Цитата(mishaSL @  18.2.2008,  09:26 Найти цитируемый пост)
Бывают ситуации, когда без этого сложно обойтись. Или вы с этим тоже не согласитесь?

Если эта ситуация не единичная, разовая, а возникает при штатном обращении к сайту, то, разумеется, не соглашусь. В этом случае надо не ансеты делать, а вообще избавляться от вороча ния бегамайтами данных.
А в единичных случаях погоды не сделает.
PM MAIL   Вверх
Хрипа
Дата 18.2.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: -6
Всего: нет



mishaSL, я согласен ведь если бы он не нужен был его бы и небыло. )
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
A1ekcandr
Дата 18.2.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 27.6.2007

Репутация: 1
Всего: 1



В любом случае после использования переменной ее лучше уничтожить, ведь каждая переменная жрет память, конечно в большинстве случаев не существенно, но писать unset() считается хорошим тоном. 

зы: Лично я не использую  smile 
PM MAIL   Вверх
CyClon
Дата 18.2.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Практики нет, но по теоретический части скажу, что unset судя по всему полезно делать за сравнительно долгое время до окончания выполнения скрипта для более-менее больших данных (чтобы память ими не была занята долгое время), а так же перед тем, как получить новую порцию объемных данных (чтобы было меньше вероятности нехватки памяти).

Делать в конце скрипта смысла абсолютно никакого не имеет, после окончания работы вся память и так освобождается. Грубый пример скрипта, когда unset необходим:

Код
<?php

for ($i = 0; $i < 65535; $i++) {
    $array[] = 'BRED';
}

// unset($array);

sleep(3600);

?>



--------------------
user posted image
PM   Вверх
flashaa
Дата 18.2.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(A1ekcandr @  18.2.2008,  17:52 Найти цитируемый пост)
но писать unset() считается хорошим тоном. 

Ситуации, когда НАДО делать unset - очень специфичны. Не стоит забывать о том, что PHP сам следит за памятью и, если грамотно спланировать области видимости переменных, ничего удалять не потребуется.
К примеру, если мы получаем выборку из БД, то она наверняка потребуется нам в отображении страницы - т.е. вплоть до самого конца работы скрипта(в хороших проектах отображение - последняя стадия). Если  мы занимаемся работой с повторяющимся куском кода, то в этом же повторяющемся куске кода и следует делать все, что хотим, а не складывать там данные до востребования. На моем опыте unset был нужен, когда получался один массив, с ним производились какие-то действия, затем из него удалялись некоторые ключи и данный массив передавался в дальнейшую обработку.

Это сообщение отредактировал(а) flashaa - 18.2.2008, 22:24
PM MAIL   Вверх
sTa1kEr
Дата 18.2.2008, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Какой смысл надевать штаны через голову? unset() предназначен совсем не для этого. http://php.net/unset
Цитата(mishaSL @  18.2.2008,  10:38 Найти цитируемый пост)
Я не думаю, что ансет хоть как-то повлияет на производительность системы и объем занимаемой памяти

А я это знаю точно, т.к. сталкивался с этим не один раз.

Откуда такая информация, что unset() высвобождает память? Хотелось бы увидеть достоверный источник этой информации или хотя бы пример кода, где именно unset() высвободит хоть байт памяти. Естественно, про данные типа "ресурс" не в счет, они действительно могут занимать много памяти и за ними действительно надо следить (mysql_free_result(), fclose(), etc).
PM MAIL   Вверх
GeneralElectric
Дата 18.2.2008, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



sTa1kEr, я запусил код, который выводит memory_get_usage, создает толстую переменную, снова выводит память, ансетит переменную и опять выводит. Память возвращается.
Винда, 5.2.5
PM MAIL   Вверх
sTa1kEr
Дата 19.2.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(GeneralElectric @  18.2.2008,  23:54 Найти цитируемый пост)
sTa1kEr, я запусил код, который выводит memory_get_usage, создает толстую переменную, снова выводит память, ансетит переменную и опять выводит. Память возвращается.

Странно, а top мне говорит совсем другое:
Код

$pid = posix_getpid();
$a = new stdClass();
for ($i = 0; $i < 104857; $i++)
{
    $a->{'a'.$i} = true;
}
unset($a);
echo `top -d1 -b | grep $pid`;
// 82069 ... 25412K 20616K ...  0:00  3.24% php-cgi

Или
Код

$pid = posix_getpid();
$a = array();
for ($i = 0; $i < 104857; $i++)
{
    $a[] = new stdClass();
}
unset($a);
echo `top -d1 -b | grep $pid`;
// 88275 ... 35476K 29900K ... 0:00 33.31% php-cgi


Это сообщение отредактировал(а) sTa1kEr - 19.2.2008, 00:06
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0652 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.