Виктор Т.
1036 сообщений
#15 лет назад
Цитата:
И пиковый расход памяти у вас не изменится

Я чего-то не понимаю в PHP или пиковый расход это несколько иная характеристика?
Эдуард Третьяков
269 сообщений
#15 лет назад
Цитата ("Sivis"):
Цитата:
И пиковый расход памяти у вас не изменится

Я чего-то не понимаю в PHP или пиковый расход это несколько иная характеристика?

Есть текущий расход памяти, есть пиковый. В зависимости от разных сборок апача текущий стремится к пиковому по совокупности запросов к скриптам. Но это в кратце.
Виктор Т.
1036 сообщений
#15 лет назад
Текущий расход - это сколько памяти используется сейчас. Пиковый расход - это максимум графика "время-память".
Логично, что после освобождение памяти пиковый расход не уменьшится.
Александр В.
276 сообщений
#15 лет назад
Цитата ("elhsmart"):

О том, как работает unset() и для чего он нужен я прекрасно представляю.
Однако даже в PHP для измерения расхода памяти есть 2 функции. Одна из них - get_memory_peak_usage(); И пиковый расход памяти у вас не изменится, хоть вы используйте unset, хоть не используйте.

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

Кроме того, прогресс не стоит на месте. И возможно скоро будем крутить в памяти серьёзные объёмы, и, может быть, скрипты будут работать продолжительное время (да взять хотябы какие либо обработки запускаемые кроном).... По этому, имхо, привыкать к хорошему стилю программирование это хорошо.

На любом языке программирования можно кивать на компиляторы: пусть, мол, они память освобождают.... Но ведь и там люди пишут, могут и ошибиться, и именно ваш скрипт будет память поджирать, а вам оправдыватся: "чейто они такие сякие не освободили память"... А ведь, по большому, счету это не правильно - память должен освобождать тот кто ее занял.

Впрочем на php я, по крайней мере пока, не озадачиваюсь освобождением памяти.


Но ведь есть и другая причина для использования unset. И в массивах тоже. Чтобы прикрыть возможные недокументированные особенности...
Эдуард Третьяков
269 сообщений
#15 лет назад
voral, прочитайте еще и то, что я написал дальше.
В любом веб-скрипте, который запускается из Апача, эффективное время работы должно составлять миллисекунды.
Иначе это либо ресурсоемкая задача, которую нужно разбить на более мелкие итерации архитектурно, либо проблема в исходниках и нужно оптимизировать работу скрипта. Использование unset() для улучшения Perfomance под нагрузкой - это не причина нагрузки, это ее следствие.

Оффтопик
Ну почему все пытаются вырвать кусок слов из общего текста и ответить на него, как на полное мнение другого человека? Моя нипанимать. Писать все в одно предложение?
Эдуард Третьяков
269 сообщений
#15 лет назад
Тема похожа на "Начали за здравие..."
От Возвраста к эффективности unset() для HA/Perfomance в PHP ^_^
Александр В.
276 сообщений
#15 лет назад
Цитата ("elhsmart"):
voral, прочитайте еще и то, что я написал дальше.
В любом веб-скрипте, который запускается из Апача, эффективное время работы должно составлять миллисекунды.
.....

Да, эту вашу мысль я не уловил.
Если честно, то мои размышления по поводу памяти просто мысли вслух и отступление в сторону.


А ближе к делу (по поводу "зачем unset" в изначальном коде) была моя вторая мысль - более короткая: Бывает необходимость пресечь вероятность дальнейшего использования некоторой переменной на определённом этапе выполнения скрипта.
Эдуард Третьяков
269 сообщений
#15 лет назад
Цитата ("voral"):
А ближе к делу (по поводу "зачем unset" в изначальном коде) была моя вторая мысль - более короткая: Бывает необходимость пресечь вероятность дальнейшего использования некоторой переменной на определённом этапе выполнения скрипта.

Всеравно в канве обсуждения итераций над массивом и в силу ужасной типизации массива как такового в PHP, я толка в использования unset при обработке (заметьте, не после нее, а именно во время обработки) не вижу. Потому как экономия на памяти может значительно отбиться на процессоре, и тут уже палка о двох концах. Либо дергать count, нагружая проц на проверку количества элементов в вашем динамическом массиве, либо добавлять инкрементарные операции, идущие во время обработки массива, либо жертвовать памятью, чтобы размер массива не менялся.
Вот только при использовании unset никто не просчитывает накладных расходов на изменение массива в памяти, а это тоже проц.
В то время как добавить планку мозгов сейчас намного проще, чем сменить проц на сервере.
Но это если смотреть на быстродействие в общем. Если же нужна экономия памяти - то да, unset'у нет равных ^_^
Тут М.
626 сообщений
#15 лет назад
elhsmart
Речь вообще шла не о том ЗАЧЕМ нужен unset, а о том, что будет с вашим перебором массива ЕСЛИ был использован unset. Использовать же его мог программист не читавший ваших рассуждений о ненужности этой функции )))
Александр В.
276 сообщений
#15 лет назад
Трудно переключится и вспомнить достойный пример....... Ну к примеру. Храним корзину покупок в сессии...... Вот она копиться копиться. А потом покупатель грохает пару позиций в середине - unset делать надо...... Придумать причину для обработки этого массива поэлементно тоже можно......

Я бы в этом случае использовал foreach Или array_walk
Юрий Осадчий
661 сообщение
#15 лет назад
1. foreach -- специальная конструкция для обхода массивов, ей следует отдавать предпочтение
2. оптимизация на уровне выноса кусков кода за цикл не определяет насколько быстро будет работать ваш скрипт/программа, самая важная оптимизация в большинстве задач -- на уровне алгоритмов, т.н. высокоуровневая оптимизация

2sa_t_an: я тоже себя считал когда-то гениальным, но жизнь как правило все ставит на свои места и отрезвляет человека и это хорошо. если она вас вовремя не отрезвит, то только вам же и хуже.
например, вы принципиально не уделяете правописанию должного внимания -- это минус.
ваша подпись в профайле -- это просто хамство, напишите о том чем вы занимаетесь и нормальный заказчик сам поймет сколько за это СТОИТ платить.

По поводу возраста... профессионализм конечно связан с ним, к тому же, это есть показатель того насколько человек серьезен, насколько с ним легко общаться по проекту -- ведь с человеком типа sa_t_an врядли кому-то будет комфортно работать -- "понты" не красят человека.

Да и вообще -- обсуждать эту тему подобно обсуждению "а зачем приватные проекты" -- ну хочет человек заказать ИМЕННО ЭТОМУ ФРИЛАНСЕРУ программу/сайт/скрипт и т.д. -- его право. Хочет работать с людьми от 24х лет -- пожалуйста, хочет с русскими -- пожалуйста. ЭТО ЕГО ПРАВО, и выкручивать ему руки -- безсмысленно.
Юрий Осадчий
661 сообщение
#15 лет назад
Цитата ("elhsmart"):
voral, прочитайте еще и то, что я написал дальше.
В любом веб-скрипте, который запускается из Апача, эффективное время работы должно составлять миллисекунды.
Иначе это либо ресурсоемкая задача, которую нужно разбить на более мелкие итерации архитектурно, либо проблема в исходниках и нужно оптимизировать работу скрипта. Использование unset() для улучшения Perfomance под нагрузкой - это не причина нагрузки, это ее следствие.

Оффтопик
Ну почему все пытаются вырвать кусок слов из общего текста и ответить на него, как на полное мнение другого человека? Моя нипанимать. Писать все в одно предложение?

unset -- не только для уменьшения использования памяти служит... вообще-то...
Tan Sa
127 сообщений
#15 лет назад
Цитата:
например, вы принципиально не уделяете правописанию должного внимания -- это минус.

Вы меня понимаете - это плюс...
Цитата:
ваша подпись в профайле -- это просто хамство, напишите о том чем вы занимаетесь и нормальный заказчик сам поймет сколько за это СТОИТ платить.

Ваша беда в том, что не вы оцениваете свои силы, а заказчик, который порой не всилах отличит CMS от SMS...
Я оставляю за собой право решать сколько стоит моя работа.
Цитата:
я тоже себя считал когда-то гениальным

Остаётца только вам сочуствовать! Я до сих пор так и остался!
Цитата:
foreach -- специальная конструкция для обхода массивов, ей следует отдавать предпочтение

Занесу в настольную книгу програмиста.

И вообще, не надо меня считать хамом. Я никого ещё не оскорбил по моему, и так называемые понты - это ответная реакция
на плевки в мою сторону...

Цитата:
Поэтому можно ожидать, что на вход может прийти массив, для которого count($array) вернет правильное значение, но перебор по порядковому индексу будет невозможен. Особенно это нельзя забывать разработчикам библиотек и фреймворков, которые используют другие программисты.


Точно, пусть помнят всегда о фукции SORT!!!

Цитата:
Хочет работать с людьми от 24х лет -- пожалуйста, хочет с русскими -- пожалуйста. ЭТО ЕГО ПРАВО

Эта не палиткорректно и пахнет расисзмом!
Вадим Т.
3240 сообщений
#15 лет назад
elhsmart, Вы не ответили на мой вопрос. Если Вам нужно удалить элемент из середины PHP массива, как Вы это сделаете? Или Вы считаете, что удалять элементы из массива в реальных задачах не может понадобиться? Ответьте пожалуйста.

Далее, почему Вы вообще подняли тему управления памятью, если речь шла только лишь об удалении элемента из середины массива с помощью unset (кстати, это стандартный способ)?
Tan Sa
127 сообщений
#15 лет назад
tvv

Тему ваще затронул я, на предмет оптимизации... А ваще еще можно удалять array_slice или array_splice
вобчем куча способов... Ток дело не в этом, а дело в том, как правильно это делать.
Кстати у вас в строке каждый раз пересчитываца массив, это надо учитывать по моему в любых работах...
Вадим Т.
3240 сообщений
#15 лет назад
Цитата ("sa_t_an"):
Кстати у вас в строке каждый раз пересчитываца массив, это надо учитывать по моему в любых работах...

Удивительно... Это в какой моей строке "каждый раз пересчитываца массив"?
Tan Sa
127 сообщений
#15 лет назад
Цитата:
for($i=0, $maxi = count($array); $i < $maxi; $i++) {


Вот тут, патамушта COUNT - эт функция PHP и при каждом цикле $maxi присваевается значение функции COUNT,
как эквивалент можно было написать

представим что вот ето внутренняя фукция PHP
function SIZE($array) {
$i=0;
while($array){
$i++;
}
return $i;
}

токда аналог вашей

for($i=0, $maxi = SIZE($array); $i < $maxi; $i++) {

каждый раз при цикле будет обращаца к SIZE($array); потому что PHP интерпритирует этот код в код C++
a C++ скомпилирует его в ассемблер и при каждом цикле ассемблер будет вызывать фукцию

MOV EAX,
CALL SIZE

примерно вот таким методом
Вадим Т.
3240 сообщений
#15 лет назад
Цитата ("sa_t_an"):
А ваще еще можно удалять array_slice или array_splice
вобчем куча способов... Ток дело не в этом, а дело в том, как правильно это делать.

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

Более того, время выполнения этих функций прямо пропорционально размеру массива. То есть чем больше массив, тем медленнее оно будет работать. Например, на массиве 2000 элементов удаление элемента через unset будет быстрее примерно раз в 20-25. И это - далеко не микросекунды. Не верите - проверьте.
Вадим Т.
3240 сообщений
#15 лет назад
Цитата ("sa_t_an"):
токда аналог вашей

for($i=0, $maxi = SIZE($array); $i < $maxi; $i++) {

каждый раз при цикле будет обращаца к SIZE($array); потому что PHP интерпритирует этот код в код C++
a C++ скомпилирует его в ассемблер и при каждом цикле ассемблер будет вызывать фукцию

MOV EAX,
CALL SIZE

примерно вот таким методом

А теперь еще раз посмотрите пожалуйста на мою строку повнимательнее, и еще раз скажите, сколько раз будет вызываться $maxi = SIZE($array)? Пожалуйста, обращайте внимание на синтаксис, как в этой строке используется оператор for, в каком порядке расставлены запятые и точки с запятой.
Вадим Т.
3240 сообщений
#15 лет назад
sa_t_an, в догонку. Что выдаст этот код?

$array = array(1, 2, 33, 4, 55);
$counter = 0;
for($i=0, $maxi = SIZE($array); $i < $maxi; $i++) {
// ...
}
echo $counter;

function SIZE() {
global $counter, $array;
$counter++;
return count($array);
}


Теперь ответьте, почему он выдаст именно такое значение $counter, а не 5 ?

Итак, сколько раз будет вызвано $maxi = count($array) в моем коде?