Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

Categories:

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.

Оригинал записи http://blog.axshavan.cz/2014/03/array-stdclass.html
Tags: web
Subscribe

  • Фотографии из мини-походика 18 июля

    На прошлой неделе мы со Славкой прошли пешком чуть больше 19 километров по южным предместьям Праги. Я выбрал маршрут таким образом, чтоб там были и…

  • Инопланетный чертополох

    Пару дней назад ходили вечером гулять по окрестностям. Я повстречал возле пруда Асуан заросли какой-то инопланетной херни. Это такие шипастые шары…

  • Плёнка №196

    Плёнка: Kodak 400TX Фотоаппарат и объектив: ФЭД-5в + Индустар И-61Л/Д 2.8/53 Проявитель: Fomadon LQN. Время проявки 10 минут при 20°C Сканер:…

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments