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.
Комментариев нет:
Отправить комментарий
Ублюдочный Гугл поломал форму комментариев. Извините.
Примечание. Отправлять комментарии могут только участники этого блога.