Как JavaScript VM реализует доступ к свойству объекта? Это хэштабл? - PullRequest
22 голосов
/ 05 июля 2011

Объекты в JavaScript можно использовать как Hashtable (ключ должен быть String). Работает ли он хорошо, как Hashtable, структура данных?

Я имею в виду, реализован ли он как Hashtable за сценой?

Обновление : (1) Я изменил HashMap на hashtable (2) Я думаю, что большинство браузеров реализуют его так же, если нет, то почему?Есть ли какое-либо требование, как реализовать это в спецификациях ECMAScript?

Обновление 2 : Я понимаю, мне просто интересно, как V8 и виртуальная машина Firefox JS реализуют средства получения / установки объекта Object.properties?

Ответы [ 3 ]

30 голосов
/ 06 июля 2011

V8 не реализует доступ к свойствам объекта как хеш-таблицу, он фактически реализует его лучше (с точки зрения производительности)

Так как это работает? «V8 не использует динамический поиск для доступа к свойствам. Вместо этого V8 динамически создает скрытые классы за кулисами», что делает доступ к свойствам почти таким же быстрым, как и доступ к свойствам объектов C ++.

Почему? потому что в фиксированном классе каждое свойство может быть найдено в определенном фиксированном месте смещения ..

Таким образом, в общем случае доступ к свойству объекта в V8 выполняется быстрее, чем в Hashtable ..

Я не уверен, как это работает на других виртуальных машинах

Более подробную информацию можно найти здесь: https://developers.google.com/v8/design#prop_access

Вы также можете прочитать больше о Hashtable в JS здесь: (мой блог) http://simplenotions.wordpress.com/2011/07/05/javascript-hashtable/

11 голосов
/ 06 июля 2011

«Я полагаю, что большинство браузеров реализуют его одинаково, если нет, то почему? Есть ли требование, как реализовать его в спецификациях ECMAScript?»

Я не эксперт, но не могуПодумайте о любой причине, по которой спецификация языка будет подробно описывать, как его функции должны быть реализованы внутри.Такое ограничение не имело бы абсолютно никакой цели, поскольку оно не влияет на функционирование языка ни в коем случае, кроме производительности.

edit - несмотря на два отрицательных голоса, фактически этоАбсолютно правильно, и фактически независимость от реализации спецификации ECMA-262 специально описана в разделе 8.6.2 спецификации:

"Описания в этих таблицахуказывают их поведение для собственных объектов ECMAScript, если в этом документе не указано иное для определенных типов собственных объектов ECMAScript. Хост-объекты могут поддерживать эти внутренние свойства с любым поведением, зависящим от реализации, если это согласуется с конкретными ограничениями хост-объектауказано в этом документе"

" Хост-объекты могут реализовывать эти внутренние методы любым способом, если не указано иное; "

Слово" хеш "нигде не встречается во всей спецификации ECMA-262.

(илиiginal, продолжение)

Реализации Javascscript, скажем, в Internet Explorer 6.0 и Google Chrome V8 почти не имеют ничего общего, но (более или менее) обе соответствуют одной спецификации.

Если вы хотите узнать, как конкретный интерпретатор javascript что-то делает, вам следует специально изучить этот движок.

Хеш-таблицы - эффективный способ создания перекрестных ссылок.Они не единственный способ.Например, некоторые движки могут оптимизировать хранилище для небольших наборов (для которых издержки хеш-таблицы могут быть менее эффективными).

В конце концов, все, что вам нужно знать, это то, что они работают.Могут быть более быстрые способы создания таблиц поиска больших наборов, используя ajax или даже в памяти.Например, посмотрите интересное обсуждение этого поста из блога Джона Ресейга об использовании структуры данных trie.

Но это ни здесь, ни там.Ваш выбор использования этого или нативных объектов JS не должен зависеть от информации о том, как JS реализует объекты.Это должно быть обусловлено только сравнением производительности: как масштабируется каждый метод.Это информация, которую вы получите, выполняя тесты производительности, а не просто зная кое-что о реализации движка JS.

0 голосов
/ 08 мая 2019

В этой статье объясняется, как они реализованы в V8, движке, используемом Node.js и большинством версий Google Chrome.

https://v8.dev/blog/fast-properties

очевидно, что «тактика» со временем может изменитьсяв зависимости от количества свойств при переходе от массива именованных значений к словарю.

v8 также учитывает тип, число или строка не будут обрабатываться так же, как объект (илифункция, тип объекта)

, если я правильно понимаю, доступ к свойству часто будет кэшироваться, например, в цикле.

v8 оптимизирует код на лету, наблюдая за тем, что на самом делеи как часто

v8 будет идентифицировать объекты с одинаковым набором именованных свойств, добавленных в том же порядке (как это делал бы конструктор класса, или повторяющийся бит JSON), и обрабатывать их в том же порядкеway.

см. статью для получения более подробной информации, а затем подать заявку в Google на работу:)

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