Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Массивы или объекты: что работает быстрее
 
 автор: fix   (09.02.2014 в 20:40)   письмо автору
 
 

Приветствую!

Вопрос касается удобства разработки.
Допустим, есть статья - у нее куча свойств: название, анонс, текст, SEO title, и т.д. Конечно, все это можно юзать из массива, полученного из БД. Но для удобства я создаю объект вида articles и описываю все его свойства.
class articles{
public $name;
public $anons;
//etc
}


Это очень удобно: в любой момент из любого места IDE подскажет, какие свойства есть у статьи.

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

Вопрос к профессионалам: насколько сильно объекты проигрывают массивам по производительности?
Описанная мной схема с объектами работает вполне успешно в одном крупном посещаемом сайте.
Но все же :)

  Ответить  
 
 автор: confirm   (09.02.2014 в 21:04)   письмо автору
 
   для: fix   (09.02.2014 в 20:40)
 

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

class articles{
public $name;
public $anons;
//etc
}


что:

<?
articles 
= [$name$anons];


в плане узнать что имеется, в чем трудности то? Хотя свойство в этом случае, это ключ.

  Ответить  
 
 автор: psychomc   (09.02.2014 в 22:24)   письмо автору
 
   для: fix   (09.02.2014 в 20:40)
 

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

  Ответить  
 
 автор: Fix   (10.02.2014 в 14:41)   письмо автору
 
   для: psychomc   (09.02.2014 в 22:24)
 

Нет, ребят, я не про базу. Я пример привел лишь с базой.
Речь не о конкретном, а теоретически. Понятно что соединение, и т.д.

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

"Если бы сами объекты догадывались что у чего-то появилось новое свойство,"
никто не догадывается что у них новое свойство. Это самое свойство прописывается в объекте через
public $new_var;


"можете сами попрофилировать и убедиться в этом" - да, но хотелось бы услышать мнение тех, кто уже так делал и практикует в крупных проектах...

  Ответить  
 
 автор: confirm   (10.02.2014 в 14:49)   письмо автору
 
   для: Fix   (10.02.2014 в 14:41)
 

>Это самое свойство прописывается в объекте через

А в массив значит прописать подобное и вызвать, это значит невероятные сложности?
В чем суть вашего вопроса - не делать лишних обращений к базе, а держать некие данные наготове, или что лучше массив или объект?

  Ответить  
 
 автор: FiX   (10.02.2014 в 15:27)   письмо автору
 
   для: confirm   (10.02.2014 в 14:49)
 

"В чем суть вашего вопроса -... " - в теме так и говорится "что работает быстрее".

Я же говорю. В IDE данные объектов выводятся сразу. А массив - не выводится.
Вы работаете в IDE? Если да, то наверняка пользуетесь автокомплитом при работе классами и методами.
Например, пишете
$articles = new Articles();
$articles->... //и вот тут IDE сразу выдает какие методы есть у класса.

Знакомо?

Так вот точно такой же принцип при работе, например, со статьей. Например, этот самый класс имеет метод get_articls_list.

class Articles{
publib function get_articles_list(){
$result = array();
// получили все статьи
while ($article = mysql_fetch_array()){ // пишу тупо чтобы было понятно
$article_item = new Article_item();
$article_item->name = $article['name'];
$article_item->description = $article['description'];
$article_item->text = $article['text'];
$result[] = $article_item;
}

return $result; // возвращаем массив, состоящий из объектов 

}
}

class Article_item{
public $name;
public $description;
public $text;
}



Разбираем полученный массив
foreach ($result as $article_item){
print $article_item-> // вот тут уже при написании нам выдастся автокомплит. 
}


Что это дает? То что не придется помнить все переменные и их написание. Даже если вернуться к проекту через 5-6 месяцев, не придется вспоминать какие же параметры доступны для статьи.
Повторяюсь: речь не только о данных, полученных с БД. Тут также может быть и константы (опубликовано/не опубликовано), какие-то расчеты типа "дата/время архивирования статьи", которое вычисляется в коде, и т.д.

Данный метод помогает нам, в команде нескольких разработчиков, знать что есть у каждого элемента и не копаться в чужом коде. Вот и все.

Надеюсь донес свою мысль.
Скриншот с IDE скинуть пока не могу - занят процессом)) Как докачает скину если нужно.

  Ответить  
 
 автор: confirm   (11.02.2014 в 03:25)   письмо автору
 
   для: FiX   (10.02.2014 в 15:27)
 

Вы не можете ставить вопросы, ибо это уже ваши проблемы разработки.

  Ответить  
 
 автор: psychomc   (10.02.2014 в 15:52)   письмо автору
 
   для: Fix   (10.02.2014 в 14:41)
 

я кажется всё более-менее понятно написал...кстати, база данных используется в 99% проектов. короче, такой подход не вреден, нравится делать так - делайте. разницы скорее всего не почувствуете совсем. если хотите, чтобы производительность выросла, переходите на php 5.4 +

  Ответить  
 
 автор: FiX   (10.02.2014 в 15:58)   письмо автору
 
   для: psychomc   (10.02.2014 в 15:52)
 

PHP 5.4+ работает лучше с объектами?)

Да, нравится делать так. Тем не менее было бы интересно узнать какое решение будет работать быстрее.

Спасибо за ответы. Может еще кто-нибудь отпишется со своими мыслями :)

  Ответить  
 
 автор: psychomc   (10.02.2014 в 16:23)   письмо автору
 
   для: FiX   (10.02.2014 в 15:58)
 

php 5.4 в принципе работает лучше, т.е быстрее более старых версий. почему - погуглите.
по поводу скорости массивов и объектов http://stackoverflow.com/questions/2193049/php-objects-vs-arrays
If you're using PHP5 then difference between objects or arrays almost is not significant
надеюсь, теперь понятно

  Ответить  
 
 автор: добряк   (10.02.2014 в 22:46)   письмо автору
 
   для: fix   (09.02.2014 в 20:40)
 

Я не совсем разбираюсь, но тут выпадает момент создания класса и загрузки памяти которая не нужна.
У массива вы сразу грузите память.
В классах вы РЕЗЕРВИРУЕТЕ память
Мне кажется если физические мощности одинаковы, то массивы ЧАЩЕ быстрее, хотя это мелочи и играют роль при ограниченных физических рессурсах.
Поэтому!!.
Ваши эксперименты ИСТИННЫ только в ВАШИХ физических условиях.

Нельзя ответить кто быстрей верблют, козел или лошадь, если не учитывать внешние условия.
В горном ландашафте быстре козлы....

  Ответить  
 
 автор: FiX   (11.02.2014 в 12:31)   письмо автору
 
   для: добряк   (10.02.2014 в 22:46)
 

добряк,
спасибо за ответ! Примерно такое я и ожидал услышать. Я догадывался что использование массивов чем-то обосновано. Теперь появилась ясность... :)

Единственное - надо будет понять, сколько именно памяти выделяется изначально. Ведь потом она расширяется по мере необходимости.
Одно дело если переменное присваивается просто TRUE, а другое - текст состоящий из 5000 символов...

Надо будет самому научиться ставить эксперименты :)

  Ответить  
 
 автор: psychomc   (11.02.2014 в 13:22)   письмо автору
 
   для: FiX   (11.02.2014 в 12:31)
 

<?
$start_time 
microtime(true);
$start_mem memory_get_usage();

// do...

$end_time microtime(true) - $start_time;
$end_mem memory_get_usage() - $start_mem;

  Ответить  
 
 автор: Fix   (12.02.2014 в 22:03)   письмо автору
 
   для: psychomc   (11.02.2014 в 13:22)
 

psychomc ,
данный способ не совсем корректно отображает расходование памяти.

  Ответить  
 
 автор: Саня   (12.02.2014 в 23:20)   письмо автору
 
   для: Fix   (12.02.2014 в 22:03)
 

Почему?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования