Я пытаюсь реализовать простой ассоциативный массив (без дубликатов) со строковыми ключами и экземплярами моих собственных «классов» в качестве значений в 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))) {
Спасибо, Вячеслав, какие-либо мысли по моему последующему вопросу? http://stackoverflow.com/q/16124556/506073 Я предполагаю, что ранее ранний выпуск в '' JSObject :: AddProperty' включен автоматически по строкам, которые вы указываете при ссылке на более глубокий тест в графе вызовов ... безопасное предположение. Извините, просто будучи немного педантичным ... слишком долго смотрел на эту «простую» проблему. Спасибо за любой вклад! :-) – ahcox
Извините, думаю, мой ответ в '' NormalizeProperties'' ... если так, не нужно отвечать. – ahcox
Как только объект вставляется в этот режим слишком много свойств, он останется в этом режиме (ну, строго говоря, существует одна эвристика, чтобы вернуться в быстрый режим: присвоение медленного объекта свойству «prototype» некоторой функции преобразует его в быстрый режим). Если вы хотите перейти в медленный режим раньше (медленный режим называется «медленным» по какой-либо причине!), Вы можете, например, добавить свойство с именем неидентификатора к объекту или добавить свойство, а затем «удалить» его. –