Подтвердить что ты не робот

Является ли подстрока Javascript виртуальной?

Если у нас есть огромная строка с именем str1, скажем 5 миллионов символов, а затем str2 = str1.substr(5555, 100), так что str2 имеет длину 100 символов и является подстрокой str1 начиная с 5555 (или любым другим случайно выбранная позиция).

Как JavaScript хранит str2 внутренне? Сопоставлено ли содержимое строки или новая строка является своего рода виртуальной и сохраняется только ссылка на исходную строку, а значения для позиции и размера сохраняются?

Я знаю, что это зависит от реализации, стандарт ECMAScript (возможно) не определяет, что под капотом реализации строки. Но я хочу узнать у какого-то специалиста, который знает V8 или SpiderMonkey изнутри достаточно хорошо, чтобы прояснить это.

Спасибо

4b9b3361

Ответ 1

AFAIK V8 имеет четыре строковых представления:

  • ASCII
  • UTF-16
  • конкатенация нескольких строк
  • фрагмент другой строки

Таким образом, ему не нужно копировать строку; он просто должен начинать и заканчивать маркеры другой строкой.

SpiderMonkey делает то же самое. (Смотрите Большие подстроки ~ 9000x быстрее в Firefox, чем Chrome: почему?... хотя ответ для Chrome устарел.)

Это может дать реальные ускорения скорости, но иногда это нежелательно, так как это может привести к тому, что маленькие строки будут удерживаться в памяти большей родительской строки (V8 отчет об ошибке)

Ответ 2

Это старое мое сообщение в блоге объясняет это, а также некоторые другие формы представления строк: http://blog.cdleary.com/2012/01/string-representation-in-spidermonkey/

Найдите "зависимую строку". Я думаю, что я знаю, с чем вы можете столкнуться с вопросом: иногда они могут быть проблематичными, потому что, если нет ссылок на оригинал, вы можете сохранить гигантскую строку вокруг, чтобы сохранить небольшую подстроку, которая на самом деле семантически достижимый. Есть вещи, которые могла бы выполнить реализация для смягчения этой проблемы, например, запись информации о генерации GC-генерации, чтобы увидеть, существуют ли такие однозависимые строковые сущности и свернуть их до их минимального размера, но в последнее время я знал, что это не было сделанный. (По сути, с таким подходом вы восстанавливаете информацию стиля runtime_refcount == 1 при времени развертки GC.)

Ответ 3

Строки immutable, и любые операции над ними создают новые строки. str2 - это совершенно новая строка, содержащая данные, скопированные из str1.