Как работает интернификация идентификатора в компиляторе TypeScript? - PullRequest
1 голос
/ 03 июля 2019

в компиляторе TypeScript, src / compiler / parser.ts содержит следующее, где identifiers представляет собой Map строк в строки:

function internIdentifier(text: string): string {
    let identifier = identifiers.get(text);
    if (identifier === undefined) {
       identifiers.set(text, identifier = text);
    }
    return identifier;
}

Это поведение аналогично функции идентификации для строк:

const id = (text: string) => text

Я предполагаю, что это для производительности. Как это может улучшить производительность? Я спрашиваю, потому что:

  • Я думаю, что виртуальные машины JS уже интернируют строки (но пока не нашли доказательств)
  • код, похоже, не экономит на создании строки. Нужно создать строку (text), чтобы найти ту же строку на карте.

1 Ответ

1 голос
/ 03 июля 2019

Экономит на памяти. Возьмите следующий пример:

const s1 = readFromFile();
const s2 = readFromFile();
const s3 = readFromFile();

Сколько разных строковых объектов у вас в памяти? 3, но все они содержат одинаковые символы.

Теперь возьмите следующее:

const s1 = internIdentifier(readFromFile());
const s2 = internIdentifier(readFromFile());
const s3 = internIdentifier(readFromFile());

Сколько разных строковых объектов у вас в памяти? Всего 1. Все три переменные ссылаются на один и тот же строковый объект.

...