2016-11-16 3 views
2

JavaScript V8 engine (Chrome, node) использует структуры ConsString внутри, чтобы представлять строки, которые объединены.Как сгладить V8 ConsString?

Один подход к сглаживанию этой структуры для простой строки, которую я могу найти в Интернете, заключается в использовании string.charCodeAt(0). Однако кажется, что это больше не работает (проверено на Chrome 54).

Есть ли другой способ заставить V8 сгладить структуру ConsString?

Способ, которым я использую эти строки после создания, выиграет от сплющенной строки (например, сокращение использования памяти).

+0

Я не знаю тонкости о внутренней работе узла, но не создаст новую строку из вашей конкатенированной строки выполнить то, что вы хотите? Например. 'new String (myConcatString)'. Или это слишком сильно влияет на производительность? – watzon

+0

@ChrisW - нет, 'new String()' не выполняет выравнивание. Вместо этого он создает оболочку вокруг того же внутреннего представления, что и источник. –

+0

Ahh Я вижу. Думаю, у меня нет полезного ввода:/ – watzon

ответ

1

Number(str) все еще сглаживает внутреннюю строку. Есть модуль npm, flatstr, который делает именно это. Таким образом, ваш код не заполнен, казалось бы, случайным звонком Number(). См. https://www.npmjs.com/package/flatstr.

+0

Хотя это действительно сглаживает экземпляры 'ConsString', также существует потенциальный недостаток - в моих тестах кажется, что если строка внутренне хранится как' InternalizedString', вызов 'Number (str)', похоже, преобразует ее в простой 'String' или' OneByteString', что потенциально увеличивает использование памяти. Поэтому каждый случай использования должен быть отдельно исследован, если обходной путь не приводит к худшим результатам. –

Смежные вопросы