Модераторы: 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   Вверх
GeneralElectric
Дата 19.2.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вот как раз информация, показываемая в top - то есть использование памяти самим интерпретатором, а не исполняемым скриптом, может и не высвобождаться, это да.
PM MAIL   Вверх
sTa1kEr
Дата 19.2.2008, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GeneralElectric @  19.2.2008,  01:15 Найти цитируемый пост)
Ну вот как раз информация, показываемая в top - то есть использование памяти самим интерпретатором, а не исполняемым скриптом, может и не высвобождаться, это да. 

А какой тогда смысл использовать unset() кроме как по прямому предназначению: разлинковки переменной, удаления элемента массива, статических переменных и прочего (где без unset() действительно не обойтись) Если памяти в системе больше не станет (хотя для глобальных переменных это может и будет иметь какой-то смыл, но это уже из другой оперы), а следовательно и общая производительность не увеличится, то какой смысл городить повсюду unset()? Это из серии бреда вроде "увеличение производительности за счет не использования интерполяции переменных в строке" или "for vs foreach" итд.

PS Особенно забавно читать подобные вопросы у авторов, которые пишут что-то вроде
Код

$r = mysql_query("SELECT * FROM `table`");
$num = mysql_num_rows($r);
// Работаем дальше, про запрос забыли... и нам все равно, что вся таблица у нас сейчас в памяти сидит, которая по сути вообще не нужна была

и после этого спрашивают, что быстрее echo или print...
PM MAIL   Вверх
Staind
Дата 19.2.2008, 14:32 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вроде как $r - это только указатель. Там, по сути, ничего не содержится. Все берется из базы. Конечно, если потом взять и написать:
$r = mysql_fetch_assoc ($r) - тогда да, другой разговор.
--------------------
Ничто так не раздражает человека, как просьба успокоиться
PM MAIL WWW ICQ   Вверх
solenko
Дата 19.2.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да, $r -- только указател на объект, который собдержится в памяти вашего сервера и принадлежит процессу php.

Добавлено через 2 минуты и 54 секунды
Вы же не на c пишете. Все равно память освобождает сборщик мусора, а не сами программисты. unset лишь разрешает ему эту память очистить.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
mishaSL
Дата 19.2.2008, 19:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(sTa1kEr @  18.2.2008,  22:51 Найти цитируемый пост)
или хотя бы пример кода, где именно unset() высвободит хоть байт памяти.

Цитата(sTa1kEr)

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

sTa1kEr, чтобы не было недопонимания объясню:
unset - уничтожает переменную, но не высвобождает память используемую интерпретатором PHP, хотя для самого PHP эта память больше не используется скриптом, что позволяет не переживать за memory_limit. НО когда мы уничтожили переменную, память которую она занимала, возможна для повторного использования.
Пример без unset:
Код

<?
$pid = posix_getpid();
$a = array();
for ($i = 0; $i < 24857; $i++)
{
    $a[] = new stdClass();
}
echo `top -d1 -b | grep $pid`;

$b = array();
for ($i = 0; $i < 24857; $i++)
{
    $b[] = new stdClass();
}
echo `top -d1 -b | grep $pid`;
?>


Результат без unset:
Код

7249 ...  32136K 24488K ....
7249 ...  37256K 29476K ....


Пример с использованием unset:
Код

<?
$pid = posix_getpid();
$a = array();
for ($i = 0; $i < 24857; $i++)
{
    $a[] = new stdClass();
}
echo `top -d1 -b | grep $pid`;
unset($a);
$b = array();
for ($i = 0; $i < 24857; $i++)
{
    $b[] = new stdClass();
}
echo `top -d1 -b | grep $pid`;
?>


Результат с использованием unset:
Код

... 32144K 24664K ...
... 32144K 24844K ...



sTa1kEr, я не пытаюсь сказать, что нужно везде использовать unset(). Я просто хочу обяснить, что если переменная занимает реально много памяти, то ее необходимо уничтожить. 


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


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


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

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



mishaSL, ясно, спасибо за разъяснения.
PM MAIL   Вверх
mishaSL
Дата 19.2.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(sTa1kEr @  19.2.2008,  19:49 Найти цитируемый пост)
mishaSL, ясно, спасибо за разъяснения. 

Всегда рад интересной беседеsmile


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


Опытный
**


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

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



MishaSL, спасибо
PM MAIL   Вверх
Хрипа
Дата 20.2.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем спасибо за дисскусию очень приятно было слушать различные мнения. )
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0757 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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