Из случайного сообщения php.net :
Если вы делаете $ any = null; то вы переписываете данные переменной. Вы могли бы освободить память / сократиться быстрее, но она может украсть циклы процессора из кода, который действительно нуждается в них раньше, что приведет к более длительному общему времени выполнения.
По-видимому, это бесспорная истина, поэтому, возможно, кто-то будет так любезен объяснить.
Я имею в виду, что, делает unset
волшебным образом не выполнение каких-либо команд сборки, тогда как $whatever = null;
делает? Ответ, как указано, примерно так же полезен, как сказать
$ whatever = null сбрасывает буфер и кеш L1, тогда как unset очищает буфер и сбрасывает кеш L2.
Techno mumbo jumbo не является ответом.
Важным отличием обоих методов является то, что unset($a)
также удаляет $a
из таблицы символов; например:
$a = str_repeat('hello world ', 100); unset($a); var_dump($a);
с$a = str_repeat('hello world ', 100); unset($a); var_dump($a);
Выходы:
Notice: Undefined variable: a in xxx NULL
Но когда используется $a = null
:
$a = str_repeat('hello world ', 100); $a = null; var_dump($a);
Выходы:
NULL
Я также запускал код с помощью теста и обнаружил, что $a = null
примерно на 6% быстрее, чем его unset()
. Кажется, что обновление записи таблицы символов происходит быстрее, чем удаление.
добавление
Другая разница (как видно из этого маленького скрипта), по-видимому, заключается в том, сколько памяти восстанавливается после каждого вызова:
echo memory_get_usage(), PHP_EOL; $a = str_repeat('hello world ', 100); echo memory_get_usage(), PHP_EOL; // EITHER unset($a); OR $a = null; echo memory_get_usage(), PHP_EOL;
При использовании unset()
возвращается все, кроме 64 байт памяти, тогда как $a = null;
освобождает все, кроме 272 байта памяти. У меня недостаточно знаний, чтобы знать, почему существует разница в 208 байтов между обоими методами, но это тем не менее.
При использовании unset, использование памяти и время обработки меньше.
Я сделал простой тест.
Учитывая простой класс:
class Cat{ public $eyes = 2; public $claws = 4; public $name = "Kitty"; public $sound = ['Meow', 'Miaou']; }
Я запустил этот код
$start = microtime(true); for($i = 10000000; $i > 0; --$i){ $cat = new Cat; $cat = null; } $end = microtime(true); printf("Run in %s and use %s memory", round($end - $start, 2), round(memory_get_usage() / 1000, 2));
Запуск в 1.95 и использование 233.29 памяти
И это
for($i = 10000000; $i > 0; --$i){ $cat = new Cat; unset($cat); }
сfor($i = 10000000; $i > 0; --$i){ $cat = new Cat; unset($cat); }
Запуск в 2.28 и использование 233.1 памяти
Для того, что стоит, кажется, null
метод работает быстрее.
Использование кода
$a = str_repeat('hello world ', 10000); $start1 = microtime(true); unset($a); $stop1 = microtime(true); $a = str_repeat('hello world ', 10000); $start2 = microtime(true); $a = null; $stop2 = microtime(true); echo 'unset time lap of '. ( $stop1 - $start1 ) .'<br>'; echo 'null time lap of '. ( $stop2 - $start2 ) .'<br>';
с$a = str_repeat('hello world ', 10000); $start1 = microtime(true); unset($a); $stop1 = microtime(true); $a = str_repeat('hello world ', 10000); $start2 = microtime(true); $a = null; $stop2 = microtime(true); echo 'unset time lap of '. ( $stop1 - $start1 ) .'<br>'; echo 'null time lap of '. ( $stop2 - $start2 ) .'<br>';
в 10 раз:
unset time lap of 5.0067901611328E-6 null time lap of 1.1920928955078E-6 unset time lap of 9.5367431640625E-7 null time lap of 9.5367431640625E-7 unset time lap of 0 null time lap of 9.5367431640625E-7 unset time lap of 2.1457672119141E-6 null time lap of 1.1920928955078E-6 unset time lap of 2.1457672119141E-6 null time lap of 0 unset time lap of 9.5367431640625E-7 null time lap of 0 unset time lap of 1.9073486328125E-6 null time lap of 9.5367431640625E-7 unset time lap of 9.5367431640625E-7 null time lap of 0 unset time lap of 1.9073486328125E-6 null time lap of 9.5367431640625E-7 unset time lap of 0 null time lap of 0
Похоже, что нулевое присвоение имеет меньшее время обработки.