понедельник, 3 марта 2014 г.

array или stdClass?

В PHP есть такое волшебное устройство, как stdClass. Это класс без особой структуры, в него можно засовывать любые свойства, и они там внутри у него через магические методы __set() и __get() устраиваются. Ну то есть это такой же массив, только для тех, у кого сильно болит жопа от дискомфорта, если оперировать не объектами. Я написал два простеньких тестовых файлика, чтоб взвесить объём массива и std-объекта и скорость обращения к элементам.

test1.php
<?
$t = microtime(true);
$a = array();
for($i = 0; $i < 100000; $i++) $a[md5($i)] = $i;
echo memory_get_usage().' '.(microtime(true) - $t);
?>
test2.php
<?
$t = microtime(true);
$a = new stdClass();
for($i = 0; $i < 100000; $i++) $a->{md5($i)} = $i;
echo memory_get_usage().' '.(microtime(true) - $t);
?>

Параметры окружения: PHP 5.5.1, 32-битный Linux Mint Debian Edition.

Вариант с массивом занимает в памяти 11441752 байта, с std-классом 11442136 (больше на 384 байта. Видимо, хранение данных и у массива, и у объекта одинаковое, только у объекта дополнительные какие-то свои штуки инкапсулированы). Оба варианта выполняются в среднем за 0.23 секунды - ну, там большую часть времени занимает хэширование, так что на показатель времени в этом тесте не смотрим.

Затем я изменил тестовые файлы так, чтоб в каждый элемент клалось не значение счётчика цикла, а, соответственно, массив или stdClass. Для массива потребление памяти во втором тесте 16241416, время выполнения выросло до 0.25 секунды. Для std-класса во втором тесте занимаемый объём ожидаемо ещё больше - 18003544, и время выполнения выросло до 0.31 секунды.

Итак, спрашивается, чем, кроме любви к объектно-ориентированному подходу можно объяснить использование stdClass вместо array, если stdClass создаётся медленнее в несколько раз, занимает места в памяти чуть-чуть больше? А ничем. И ещё недавно обнаруженная мной особенность реализации stdClass в PHP: проверка if($a) даёт false в том случае, если $a - это пустой массив, и true, если $a - это свежесозданный stdClass.

Комментариев нет:

Отправить комментарий

Ублюдочный Гугл поломал форму комментариев. Извините.

Примечание. Отправлять комментарии могут только участники этого блога.