Функция unset() в PHP может улучшить производительность?


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

Следующий пример фрагмент:

<?php
# aqui um array multidimensional com 10k de linhas
$data  = array(...);
# aqui peguei o que eu precisava da variável acima
$total = (int) count($data); 
# a partir de agora não preciso mais usar a variável $data
?>

от линии, что мне не нужно использовать переменную в остальной части кода, мне нужно удалить ее с помощью unset($data) в то, что я привел выше? Это назад некоторые улучшения в производительности на самом деле? Потому что, мне кажется, что такой же обработки, что бы загрузить она даже не использовать, было бы обработки удалить ее.

Author: Maniero, 2016-07-30

4 answers

Зависит от контекста, потому что если неправильно применен вызывает обратный эффект, увеличивая использование памяти и обработки.

Вот простой тест:

Тест 1

Здесь мы используем unset(), чтобы удалить индексы переменной $arr 1 по 1.
логика здесь в том, что мы уже делаем итерации в каждом из индексов, то теоретически могут быть более мощный уже идти, удалив каждый, верно?

$arr = range(1, 100000);
foreach ($arr as $k => $v) {
    if ($k % 2 === 0) {
        $arr2[] = $v;
    }
    unset($arr[$k]);
}

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

Пик: 17174288 (17mb)
Ток: 10883880 (10mb)

Время выполнения (в микросекундах)

Итого: 0.0090339183807373
Начальная: 1469910070.9007
Конец: 1469910070.9097




2 Тест

В Этом второй тест, мы думаем, на другому. Исходя из логики, что каждый раз, когда unset() вызывается, будет потребляют больше памяти и обработки. Например, конечной целью является стереть полностью переменной $arr таким образом, мы можем сделать это, вызвав unset() только 1 раз, после цикл повторить.

$arr = range(1, 100000);
foreach ($arr as $k => $v) {
    if ($k % 2 === 0) {
        $arr2[] = $v;
    }
}
unset($arr);

В результате использования памяти:

Пик: 10882752 (10mb)
Ток: 4592344 (4mb)

Время выполнения (в микросекундах)

Итого: 0.0061979293823242
Начальная: 1469910142.5007
Конец: 1469910142.5069

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

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

Правило:

  1. повторил вызов функции создает растущее потребление.
  2. Нанесите unset() объекты, которые больше не будут использованы, в основном если еще есть дополнительные процедуры, которые необходимо выполнить. Так вы сэкономите памяти для остальных процессов.

, Сборщик мусора?

Мы Можем утверждать, что это "ненужный" иметь эту осторожны, потому что в конце всех процессов, все "умирает", но, в зависимости от контекста это всегда хорошо, чтобы освободить место в памяти.

PHP имеет ограничитель использование памяти, определяется в конфигурации (php.ini). Обычно по умолчанию 64 мб и 128 мб. Сценарий, который приходит в половине обработка уже потребляют 125mb, например, есть большой риск вызвать interrompimento выполнения из-за недостатка памяти. Многие из этих случаев "out of memory" можно было бы избежать, если сценарий понес переменные, которые не используются. Поэтому вполне допустимым иметь тщательно освободить место в памяти во время казни.





Термины, используемые
пика: наибольший объем пространства, используемого во время выполнения, то есть "пик памяти"

ток: объем памяти, используется сразу после отключенном()

начальная и конечная: время начала и время окончания работы в формате timestamp, используя функцию microtime()

итого: это расчет разницы между временем начала и время окончания, в микросекундах.

 10
Author: Daniel Omine, 2020-06-11 14:45:34

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

Эта команда говорит, что переменная не используется. Это не увеличивает производительность. До потребляет некоторую минимального, чтобы сказать это.

-то Может подумать, что там будет в выигрыше, потому что память освобождается. Это даже может быть правдой, а вполне конкретных обстоятельствах, где имеет ограничение большой памяти, и приложение создать в течение длительного времени, что редко на PHP. Но не это потому, что функция даже не освобождает память. Максимум позволяет отпуска производится.

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

Если возникнет ситуация, что производительность важна, и есть четкое указание (измерить), что потребление памяти, заставляя кода, чтобы сделать swap диска, там может быть интересно дать это решение.

, По крайней мере, с точки зрения производительности, если не докажут, что команда может необходимый результат (истина), не тратьте на это время.

 7
Author: Maniero, 2016-07-30 19:52:49

Hello,

Объем свободной памяти не влияет на производительность ваших программ на PHP. Вы только получаете больше пространства для выделения памяти для создания переменных.

Даже в ситуации, где вы поглотил всю доступную память, это не будет иметь влияние на производительность, поскольку интерпретатор PHP ограничивает количество памяти, которое может быть занято процесс, допуская, что он унижать системы.

 1
Author: taiar, 2016-07-30 19:55:50

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

 1
Author: Ivan Ferrer, 2016-08-01 14:27:23