Используют ли распространенные движки JavaScript, такие как V8 и JavaScriptCore WebKit, интернирование строк для строк JavaScript? Или они на самом деле хранят в памяти несколько экземпляров одинаковых строк?
Используют ли обычные реализации JavaScript интернирование строк?
Ответы (3)
Да. Как правило, любая литеральная строка, идентификатор или другая постоянная строка в исходном коде JS интернируется. Однако детали реализации (например, что именно интернировано) различаются, а также когда происходит интернирование.
Обратите внимание, что строковое значение не совпадает со строковым объектом, хотя строковые объекты не интернируются, потому что это было бы принципиально неверным поведением.
http://jsperf.com/strinterning
Да в Хроме, нет в Авроре 15 и ФФ 13! Сравнение двух строк на 85% медленнее, чем сравнение двух указателей в Firefox. Однако в Chrome такая же скорость, что указывает на то, что он сравнивает два указателя.
Может быть, команде разработчиков JS в Mozilla следует проверить свой код...
Краткий ответ: иногда да, иногда нет.
Я также наткнулся на тот же вопрос и немного изучил его. Кажется, что интернирование обычно выполняется для строковых литералов, которые генерируются одинаково (например, всегда присваивают одну и ту же строку переменной в одном и том же цикле), НО я также смог создать пример, который приводит к созданию двух идентичных строк. с двумя разными ссылками:
Как видите, каждая строка хранится дважды, имея разные ссылки.
Это код, который я использовал для создания повторяющихся строк:
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 раз, поэтому интернирование строк все еще выполняется для конкатенированных строк, созданных в внешняя петля.
a
и b
), но В моментальные снимки включаются только достижимые объекты. Если вы сохраняет ссылки на ранее объединенные строки, тогда вы получите 200 копий каждой строки.
- person Han Seoul-Oh; 20.05.2021