Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длинные массивы и память 
V
    Опции темы
Aliance
Дата 14.4.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Интересует следующая вещь, если я имею массив вида:
Код

var a = [];
a[10000000] = 1;
a[999999999999] = 5;

будет ли этот код намного больше есть памяти, чем следующий:
Код

var a = [ 1, 5 ];

PM MAIL WWW ICQ Skype   Вверх
bars80080
Дата 14.4.2009, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 15
Всего: 315



имхо, да. уже не раз встречал ситуацию, когда развёртывание массива в котором были только элементы [2009] к примеру приводило к тому, что и все элементы от 0 тоже существуют
PM MAIL WWW   Вверх
Aliance
Дата 14.4.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Существуют - это одно, а вот нагружают ли они оперативку?
Один товарищ мне сказал, что нет. Фактически, это ассоциативный массив получается по его словам. Но подкрепить свои слова он не смог.

И если все же нагрузка есть - какие альтернативы?
PM MAIL WWW ICQ Skype   Вверх
IDVsbruck
Дата 14.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



При
Код

var a = [1, 5];

длина массива a.length будет равна 2.
А при
Код

var a = [];
a[10000000] = 1;
a[999999999999] = 5;

длина будет уже 1000000000000, при указании любого другого индекса выдаст undefined, то есть "промежуточные" элементы точно не создаются, также как для первого случая при задании a[10] выдаст тот же undefined. Думаю, это служит подтверждением, что объем в памяти этих структур не должен изменяться (по крайней мере, очень несущественно - за счет индексов может быть расхождение).

Но это точно не ассоциативный массив (которого, кстати, в js не существует - это простой Object) и занимает он точно другой объем. Правда, не могу сказать, в какую сторону, так как не исследовал, но Array и Object - примитывы, но в js все есть объект, следовательно, Array может расширять реализацию Object, что не может не отразиться на объеме.
Другое дело, что хранение в памяти индексов точно разное: для массивов оно только численное (т.е. занимает "мало"), а для объектов (ассоциативных массивов) - литеральное, т.е. может занимать значительно больше.
PM MAIL   Вверх
Aliance
Дата 14.4.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Нет, все это я понимаю и знаю.
Вопрос именно вот в чем:
Цитата(IDVsbruck @  14.4.2009,  13:28 Найти цитируемый пост)
Думаю, это служит подтверждением, что объем в памяти этих структур не должен изменяться 

поясни этот момент. То есть примитивы "undefined" и "не задан вовсе" - одно и то же в контексте выделяемой памяти? Просто мне почему-то кажется, что "undefined" - это все-таки есть некое объявление переменной (объявление в том, что переменная не существует). Я не прав?

P.S.: разности в памяти под сами индексы, конечно же, в расчет не берем.
PM MAIL WWW ICQ Skype   Вверх
IDVsbruck
Дата 14.4.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



Ага, разобрался. Вот выдержки из ECMA-262:

15.4 Объекты Array
Объекты типа Array (массивы) специальным образом обрабатывают обращения к определённому классу имён свойств. Имя свойства P (в форме строкового значения) является индексом массива в том и только в том случае, когда ToString(ToUint32(P)) равняется P и ToUint32(P) не равняется 232 - 1. Каждый объект типа Array обладает свойством length, значение которого всегда равно неотрицательному целому, меньшему, чем 232 . Значение свойства length численно больше чем имя каждого свойства, являющегося индексом массива. Когда свойства объекта типа Array создаются или меняются, другие свойства по необходимости корректируются для поддержания этого соотношения.
...
15.4.1 Вызов конструктора Array как функции 
Когда Array вызывается не как конструктор, а как функция, он создаёт и инициализирует новый объект типа Array. Таким образом, вызов функции Array(...) эквивалентен выражению создания объекта new Array(...), вызванному с теми же аргументами.
...
15.4.2.2 new Array(len)
...
Если аргумент len имеет тип Number и ToUint32(len) равно len, то свойство length создаваемого объекта устанавливается в ToUint32(len). Если аргумент len имеет тип Number и ToUint32(len) не равняется len - бросается исключение RangeError.


То есть на хранения индекса, будь то 0 или 999999999999, все равно выделяется 4 байта (2^32), а индекс - только указатель. Следовательно, оба варианта будут занимать в памяти совершенного одинаковый объем.
PM MAIL   Вверх
Aliance
Дата 14.4.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Отлично, спасибо smile 
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.