Используют ли обычные реализации JavaScript интернирование строк? - PullRequest
33 голосов
/ 11 марта 2011

Используют ли обычные механизмы JavaScript, такие как V8 и JavaScript WebCit WebCit, интернирование строк для строк JavaScript?Или они на самом деле хранят несколько экземпляров одинаковых строк в памяти?

Ответы [ 3 ]

24 голосов
/ 11 марта 2011

Да. В общем случае любая литеральная строка, идентификатор или другая константная строка в JS-источнике интернируется. Однако детали реализации (например, что именно интернировано) могут отличаться, а также когда происходит интернирование.

Обратите внимание, что строковое значение не совпадает со строковым объектом, хотя строковые объекты не интернированы, потому что это было бы в корне неверным поведением.

10 голосов
/ 04 июля 2012

http://jsperf.com/strinterning

Да, в Chrome, нет в Авроре 15 и FF 13! Сравнение двух строк на 85% медленнее, чем сравнение двух указателей в Firefox. Однако в Chrome та же скорость, что свидетельствует о том, что он сравнивает два указателя.

Может быть, команда разработчиков движка JS в Мозилле должна проверить свой код ...

1 голос
/ 31 октября 2018

Короткий ответ: иногда да, иногда нет.

Я также наткнулся на тот же вопрос и немного разбирался в нем.Кажется, что интернирование обычно выполняется для строковых примитивов, которые генерируются одинаковым образом (например, всегда присваивают одну и ту же строку переменной в одном и том же цикле), НО я также смог создать пример, который приводит к созданию двух идентичных строкс двумя разными ссылками:

enter image description here

Как видите, каждая строка сохраняется дважды, имея разные ссылки.

Этокод, который я использовал для генерации дублирующих строк:

const a = [];
const b = [];

for(let j  =1; j<= 100;++j){
    for(let i = 1; i <= 10000; ++i) a[i] = 'player 1 got 5 points from player 2' + i;
    for(let i = 1; i <= 10000; ++i) b[i] = 'player 1 got 5 points from player 2' + i;
}

Кажется, что интернирование строк выполняется для строковых примитивов, но не для конкатенированных строк, но, как вы можете видеть выше, каждая конкатенированная строка появляется только дважды, а не100x2 = 200 раз, поэтому для конкатнированных строк, созданных во внешнем цикле, все еще выполняется интернирование строк.

...