2013-04-20 10 views
2

Я пытаюсь реализовать простой ассоциативный массив (без дубликатов) со строковыми ключами и экземплярами моих собственных «классов» в качестве значений в JavaScript. Я доволен ожидаемым поведением O (1) хэш-набора или времени доступа O (log n) набора, реализованного как сбалансированное дерево.Будет ли V8 создавать скрытые классы для объекта, используемого как ассоциативный массив? (Большое количество свойств)

Я обращается к простому использованию объекта, к которому я динамически добавляю новые свойства, но я на Node.js и столкнулся с оптимизацией скрытых классов V8 (see description of V8 hidden classes here).

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

Я просто клонировал код V8, поэтому указатели на него будут приветствоваться вместе с ответом на мой вопрос.

Благодарим за помощь.

Последующие 1

Спасибо @ ВЯЧЕСЛАВ-Егоровым, я вижу код сторожевую ниже в JSObject::AddFastProperty в вашей ссылке. Не копаясь в большем количестве кода, это кажется большим количеством накладных расходов при каждой новой вставке свойств. Я думаю, что я вижу что-то вроде режима для каждого объекта, из-за которого JSObject::AddFastProperty никогда больше не будет вызван. Таким образом, JSObject::AddProperty звонит прямо в JSObject::AddSlowProperty без особого шума. Нужно ли мне что-либо делать, чтобы подтолкнуть объект к этому режиму или будет ли он работать с избыточным временем, используя собственные показатели?

if ((!name->IsSymbol() && !IsIdentifier(isolate->unicode_cache(), name) 
    && name != isolate->heap()->hidden_string()) || 
    (map()->unused_property_fields() == 0 && 
    TooManyFastProperties(properties()->length(), store_mode))) { 

ответ

1

Да, V8 переключает свойства объекта на представление словаря, когда он замечает этот объект has too many properties.

Сколько «слишком много» зависит от нескольких факторов (как создавался объект, сколько свойств он имел, как свойства добавляются к объекту). Например, если объект был создан как пустой литерал объекта, «слишком много» будет около 30 свойств.

+0

Спасибо, Вячеслав, какие-либо мысли по моему последующему вопросу? http://stackoverflow.com/q/16124556/506073 Я предполагаю, что ранее ранний выпуск в '' JSObject :: AddProperty' включен автоматически по строкам, которые вы указываете при ссылке на более глубокий тест в графе вызовов ... безопасное предположение. Извините, просто будучи немного педантичным ... слишком долго смотрел на эту «простую» проблему. Спасибо за любой вклад! :-) – ahcox

+0

Извините, думаю, мой ответ в '' NormalizeProperties'' ... если так, не нужно отвечать. – ahcox

+0

Как только объект вставляется в этот режим слишком много свойств, он останется в этом режиме (ну, строго говоря, существует одна эвристика, чтобы вернуться в быстрый режим: присвоение медленного объекта свойству «prototype» некоторой функции преобразует его в быстрый режим). Если вы хотите перейти в медленный режим раньше (медленный режим называется «медленным» по какой-либо причине!), Вы можете, например, добавить свойство с именем неидентификатора к объекту или добавить свойство, а затем «удалить» его. –