Users list

PHP объекты против массивов

У меня есть огромное количество объектов PHP для нейронной сети, для которой я должен перебирать и выполнять некоторые математические операции. Мне было интересно, не лучше ли мне использовать ассоциативный массив над экземплярами классов? Я имею дело с объектами 3640 и итерацией вокруг 500 раз (в лучшем случае) поверх этого, поэтому любая микро-оптимизация очень помогает. Было бы неизбежно быстрее $object[‘value’] сделать $object->value ? Изменить:. Они одинаковы. Но я думаю, что для конструктора будет немного накладных расходов? В любом случае, я не думаю, что хочу обменять мои красивые классы на грязные массивы: P

7 ответов

 function p($i) < echo '
'; print_r($i); echo '

'; > $t0 = microtime(true); $arraysOf=array(); $inicio=memory_get_usage(); for ($i=0; $i $arraysOf[]=$z; > $fin=memory_get_usage(); echo '

arrays: '.(microtime(true) - $t0)."

"; echo '

memory: '.($fin-$inicio)."

"; p($z); $t0 = microtime(true); $arraysOf=array(); $inicio=memory_get_usage(); for ($i=0; $iaaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; > $arraysOf[]=$z; > $fin=memory_get_usage(); echo '

arrays: '.(microtime(true) - $t0)."

"; echo '

memory: '.($fin-$inicio)."

"; p($z); $t0 = microtime(true); $arraysOf=array(); $inicio=memory_get_usage(); for ($i=0; $iaaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; > $arraysOf[]=$z; > $fin=memory_get_usage(); echo '

arrays: '.(microtime(true) - $t0)."

"; echo '

memory: '.($fin-$inicio)."

"; p($z); ?>

arrays: 1.8451430797577 memory: 460416 Array ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 1.8294548988342 memory: 275696 SomeClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 2.2577090263367 memory: 483648 stdClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) 
  • Класс — это посты, чем массивы (но незначительно).
  • stdClass является злым.
  • Класс использует меньше памяти, чем массивы. (примерно на 30-40% меньше!!)

ps: как примечание, если класс определен, но члены тогда, использование этого класса медленнее. Он также использует больше памяти. Очевидно, секрет заключается в определении членов

Update

Я обновил с php 5.4 до php 5.5 (5.5.12 x86 windows).

arrays: 1.6465699672699 memory: 460400 Array ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 1.8687851428986 memory: 363704 SplFixedArray Object ( [0] => aaa [1] => bbb [2] => aaabbb ) arrays: 1.8554251194 memory: 275568 SomeClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 2.0101680755615 memory: 483656 stdClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) 

Заключение для php 5.5

  • Для массивов PHP 5.5 быстрее PHP 5.4, для объекта он почти такой же
  • Класс медленнее, чем массивы, благодаря оптимизации PHP 5.5 и массивов.
  • stdClass является злым.
  • Класс по-прежнему использует меньше памяти, чем массивы. (на 30-40% меньше!!).
  • SplFixedArray похож на использование класса, но он использует больше памяти.

Молодец, добрый сэр. Было бы интересно расширить это до вложенных массивов и т. Д. Интересные сайты для другой производительности PHP: phpbench.com php-benchmark-script.com, но мне нравится, что вы также использовали память.

В PHP7 разница между массивами и объектами стала более значительной. Ваш скрипт показывает разницу в 30% времени выполнения и 60% памяти. Это просто моя машина, но, как правило, не использовать массивы в качестве структур. Используйте объекты вместо 🙂

Я использовал этот код для «профилирования» (1000 экземпляров, 1000 000 операций чтения/записи):

function p($i) < echo '
'; print_r($i); echo '

'; > $t0 = microtime(true); for ($i=0; $i > echo '

arrays: '.(microtime(true) - $t0); p($z); $t0 = microtime(true); for ($i=0; $iaaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; > > echo '

obj: '.(microtime(true) - $t0); p($z); echo '

phpversion '.phpversion();

Он выводит на моем хостинге LINUX этот материал:

arrays: 1.1085488796234 Array ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) obj: 1.2824709415436 stdClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) phpversion 5.2.17 

поэтому в заключении: объекты медленнее даже на PHP 5.2. Не используйте объекты, если вам действительно не нужны их функции oop.

от пользователя levans stackoverflow.com/users/1473035/levans : я запустил это с 5.3.8, и объекты были медленнее, 0.51839280128479 для массивов против 0.85355806350708 для объектов. Я также запустил его на 5.4.13 и получил противоположные результаты, вероятно, из-за оптимизации классов, выполненной в 5.4, 0.6256799697876 для массивов против 0.43650078773499. Таким образом, похоже, что таблицы изменились, и теперь объекты — это путь.

Хороший ответ, я только что проверил на XAMPP (Apache) и получил следующие результаты: arrays: 0.5174868106842 Array ([aaa] => aaa [bbb] => bbb [ccc] => aaabbb) obj: 0.72189617156982 stdClass Object ([aaa] => aaa [bbb] => bbb [ccc] => aaabbb) phpversion 5.4.19

Я также побежал на 5.4.13, но получил противоположность Жан-Бернарду Пеллерину: Массивы: 0.5020840167999 Объекты: 1.0378720760345 Так что я бы пока не фиксировал объекты.

Я сделал некоторые изменения в коде, и Class работает быстрее, чем Arrays для php 5.4 (5.4.16, 32bit Windows). Я поставил новый ответ, который объясняет причину.

Источник

Массивы или Объекты? Хочу коллекции в пхп!

Чего уж скрывать, мне нравятся объекты, и не нравятся ассоциативные массивы. И когда выбираю из базы некий набор данных, хочется получать набор объектов а не массив массивов. Причем не просто набор объектов, а нужный мне набор и именно так как я этого хочу. Раньше происходила выборка из базы в 3 этапа:
1. получить массив данных из бд
2. пройтись по результату
3. на каждой итерации создать объект и сунуть в другой массив
Ну и собственно вернуть данные наружу. Это не то чтобы напрягало сильно, но чувствовал что должен быть способ проще и удобней. И я его нашел — Коллекции.

Очень нравятся коллекции. Всегда хотелось иметь массив однотипных данных, в частности объектов. Особенно в связке с бд.
Самая банальная ситуация — хочу получить массив объектов User из бд:
Метод Db_users::getAll()
1. считываем данные из бд
2. проходимся по массиву результатов и загоняем каждую строку в объект User
3. сохраняем полученный объект User в другой массив который отдаем наружу
Как-то так это происходит:

static public function getAll() < $result = array(); $data = $this->db->fetchAll(); foreach( $data as $row ) < $user = new User( $row ); $result[] = $user; >return $result; > 

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

      User ID User login User email User name   id; ?> login; ?> email; ?> name; ?>    

И так постоянно. Все вроде хорошо и работает, но что-то не так. Первое что бросается в глаза — два цикла. Первый при создании массива сущностей, и второй при выводе. Два цикла по (грубо говоря) одному и тому же массиву — зачем? Первая мысль — PDO!
Да у него ведь есть волшебный метод fetchObj. Он многим подойдет, но мне не нравится одна его особенность:

class A < public function __construct() < echo "
construct"; > public function __set($key, $val) < echo "
setter"; > > $pdo = new PDO('mysql:dbname=home;host=127.0.0.1', 'root'); $sql = 'SELECT id FROM `table`'; $res = $pdo->query($sql); var_dump( $res->fetchObject('A') ); Вывод будет: setter setter constructobject(A)#3 (0)

(Добрые люди подсказывают о PDO::FETCH_PROPS_LATE, это решает проблему установки свойств до вызова конструктора.)
Если вам это не принципиально, то на этом можно остановиться, меня же не устраивало что конструктор вызывается после установки свойств (у меня в конструкторе создавался фильтр отдельным классом, не хочется вставлять костыли с проверками на пустые переменные), да и все поля устанавливались как свойства, так что едем дальше.
Есть великолепное встроенное решение — ArrayIterator. Хороший такой себе объект, с геттерами и сеттерами как у массива и возможностью перебора в foreach. Как раз то что надо.

class Collection extends ArrayIterator
static public function getAll() < $result = array(); $data = $this->db->fetchAll(); $result = new Collection( $data ); return $result; > 

Уже лучше, но какая же это коллекция? Мы просто банально скопированный массив. Так не очень интересно. Хочется получать объект, причем полноценный.
Смотрим на методы ArrayIterator::offsetGet (доступ по ключу как в массиве) и ArrayIterator::current (доступ при переборе в foreach и получение элемента функцией current) этои методы возвращают значение по ключу и текущий элемент по внутреннему указателю соответственно, то что нужно, переопределяем:

public function offsetGet( $index ) < if( empty( $this->_cache[$index] ) ) < // по просьбам трудящихся $this->_cache[$index] = new User( parent::offsetGet[$index] ); > return $this->_cache[$index]; > public function current( ) < $index = parent::key(); if( empty( $this->_cache[$index] ) ) < // по просьбам трудящихся $this->_cache[$index] = new User( parent::current() ); > return $this->_cache[$index]; > 

Отлично, вроде бы все ок, избавились от лишних циклов, заменили массив объектом
Как последний штрих, можно добавлять возвращаемый класс динамически.

Источник

PHP ЧЕМ ОБЪЕКТ ОТЛИЧАЕТСЯ ОТ МАССИВА

В PHP объекты и массивы являются двумя разными способами организации и хранения данных. Массивы представляют собой упорядоченный список значений, которые могут быть доступны по индексу или ключу. В то же время, объекты основаны на концепции классов и инкапсулируют данные и функции внутри себя.

Одной из главных разниц между объектами и массивами является то, что в массивах доступ к данным осуществляется по индексу или ключу, а в объектах — через свойства и методы объекта. Например:

$arr = array(‘apple’, ‘orange’, ‘banana’);
echo $arr[0]; // выводит ‘apple’
class Fruit public $name;
function setName($name) $this->name = $name;
>
function getName() return $this->name;
>
>
$f = new Fruit;
$f->setName(‘apple’);
echo $f->getName(); // выводит ‘apple’

Кроме того, объекты могут иметь наследование, что позволяет создавать новый класс на основе существующего с повторным использованием кода. А массивы, в отличие от объектов, не могут быть наследованы.

Еще один важный аспект заключается в том, что массивы могут содержать любые типы данных, включая другие массивы, в то время как объекты могут содержать только свойства и методы.

#34 Уроки PHP — Учим язык PHP, Слияние и сравнение массивов на языке php

#35 Уроки PHP — Учим язык PHP, Проверка существования и удаление элементов массива на языке PHP

PHP и ООП. Классы и объекты. Смысл ООП.

Массивы в PHP — часть 1 — Базовый курс PHP-7

Основы php Типы данных массивы, объекты, ресурсы

#33 Уроки PHP — Учим язык PHP, Обход массива циклом for и foreach на языке PHP

Классы и объекты в php — часть 1 — Базовый курс PHP-7

Источник

Форум PHP программистов ► Клиентская сторона ► JavaScript

Всем привет!
Ребят, подскажите чем отличаются массивы от объектов? Сейчас учу javascript и не могу понять разницы между ними, вроде одно и то же.

Сообщений: 1067
Пользователь №: 40808
На форуме:
Карма: 14

Сидел он, дум великих полон — и вдаль глядел

Сообщений: 15860
Пользователь №: 4190
На форуме:
Карма: 490

Цитата (ak167 @ 11.05.2015 — 19:44)
подскажите чем отличаются массивы от объектов? . не могу понять разницы между ними

В JS всё является объектом 🙂 В том числе и массив. Только массив — это специфический объект, имеющий определенные свойства и методы. Он, в некотором смысле, упрощает работу с большими объемами данных, структурируя их в виде, называемом «массив».

В то же время, да, обращаться к элементам массивов и к объектам можно полностью идентичными способами. Например, глядя на запись

и также будет не понятно, что такое «a» — либо это массив (который тоже объект и которому мы назначаем свойство «house»), либо это просто объект.

Поначалу это может «смущать» и вносить путаницу в голову, но если немного поработаешь с JS, то научишься легко это всё различать и правильно использовать.

Несильно отличается, на самом деле. Потому что, как я уже сказал, массив является объектом, но у него есть еще свои специфические свойства и методы, отличающие его от других объектов.

Это сообщение отредактировал sergeiss — 11.05.2015 — 20:42

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* «накапливаю умение телепатии» (С) и «гуглю за ваш счет» (С)

Источник

Читайте также:  Java android imageview xml
Оцените статью