Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Массив объектов или объект объектов (https://javascript.ru/forum/misc/12615-massiv-obektov-ili-obekt-obektov.html)

vladlen 26.10.2010 04:48

Массив объектов или объект объектов
 
Достопочтенная публика, на ваше публичное осуждение выставляется мой замутненый разум, в значительной степени ОН расщепленный.
Если Array - объект, и содержит объекты то это как не крути массив объектов со всеми присущими тратами памяти, с другой стороны если взять Хэш массив, опять таки объект, то опять таки имеем массив объектов, правда с "именованными" ключами.
Вопрос: нахрена козе баян? Ну а если серьезно, то где памяти больше утечет?

Gvozd 26.10.2010 08:29

Сам-то как думаешь?
Все специфичные методы объектов Array, и Object находятся в прототипах.
то есть большая часть затраты памяти - напрямую связано с самим абстрактным типом данных.
ну, и вполне очевидно, что ассоциативный массив занимает больше памяти чем неассоциативный

Kolyaj 26.10.2010 09:23

А с чего памяти вообще утекать-то?

tenshi 26.10.2010 12:26

в яваскрипте нет массивов ;-)

vladlen 26.10.2010 13:15

tenshi, а кто сказал что они есть?
Kolyaj, я не имел в виду "утечки" как таковые, речь идет о тратах памяти.
Gvozd, так-то так, только есть у меня подозрения что ?!"маленькие"!? массивы выгоднее делать на основе Object, а не Array. Но с другой стороны, Array потомок Object, а значит каждое значение отягощено всей дребухой присущей как тому, так и другому в случае хранения числовых значений.
В общем нехрена не очевидно ;) Но линия такая тонкая :blink:
Вы меня просветлите, мож я че не так думаю :D

З.Ы. Согласитесь, тема более интересная чем: "напишите мне скрипт, а то я тут только сегодня зарегался" или "у меня на сайте, адрес которого я вам не дам, в коде ошибка которую я вам не покажу, в чем дело-то" :victory:

Kolyaj 26.10.2010 13:18

Тема неинтересная, вы не заметите разницы, особенно на ?!"маленьких"!? массивах.

vladlen 26.10.2010 14:11

Ну пока это поделки, да. Однако некоторые поделки вырастают до разных размеров :) Я предпочитаю, по возможности, подумать и написать помелче код. А если тонкости языка известны, то какие проблемы.
Вот в частности в PHP при использовании цикла for лучше написать ++$i, а не наоборот. В случае одного цикла это значения не имеет, а вот в случае навороченной CMS уже имеет, но никто особо не стремиться все это переписывать, хлопотно. Со сборщиком мусора там тоже тараканы есть. И тут тоже плюшки свои есть.
Подискутировать на тему высоких материй всегда интересно, можно даже ченить подчерпнуть :)
Насчет маленьких, не замечу, но она есть, однако при правильном использовании и при больших будет разница. Только вот неплохо было бы понять критерий слова "правильное" :)
А также не стоит забывать, что объем затраченной памяти обратно пропорционален производительности.

Kolyaj 26.10.2010 14:38

Цитата:

Сообщение от vladlen
В случае одного цикла это значения не имеет, а вот в случае навороченной CMS уже имеет

И в случае навороченной CMS не имеет, т.к. в процессе одного запроса все эти циклы запускаться не будут, а в одном случае один цикл, в другом -- другой. Поэтому разницы вы опять же не заметите. Даже если у вас внезапно появится цикл с перебором миллиона элементов (какие обычно делают в подобных тестах), то основное время будет тратиться на обработку самих элементов, а не на $i++, так что смена на ++$i опять же ничего не даст.


Я не понимаю, на чём вы пытаетесь память сэкономить, на именах свойств?

Gvozd 26.10.2010 15:34

Цитата:

Сообщение от vladlen
Array потомок Object, а значит каждое значение отягощено всей дребухой присущей как тому, так и другому в случае хранения числовых значений.

Array имеет в качестве прототипа экземпляр Array-а, который имеет в качестве прототипа экземпляр Object-а
поэтому "дребуха" хранится в уже и так существующих объектах, и никак не сказывается на размер новых объектов.

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

vladlen 26.10.2010 15:36

Цитата:

Сообщение от Kolyaj (Сообщение 75949)
Я не понимаю, на чём вы пытаетесь память сэкономить, на именах свойств?

Экономя память поднимается производительность. На рациональном использовании того что лучше подходит для решения тех или иных задач.
Не забывайте, Вы работаете с объектами и значит вы имеете дело с указателями ссылающимися на другие указатели, а данные разбросаны по памяти. Чем больше объект с которым вы работаете, тем больше фрагментированна память. Ну и пошли поехали. Каждая реализация интерпритатора: JScript, БелкаРыба да и хер как там они называются могут оптимизировать работу с ней, но могут этого и не делать.
Вам ASM известен, хоть поверхностно? Если да, то должны понять о чем я и к чему все это.


Часовой пояс GMT +3, время: 01:09.