标识符检查在TypeScript编译器中如何工作?

时间:2019-07-03 15:14:25

标签: typescript compiler-construction compiler-optimization

在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 个答案:

答案 0 :(得分:1)

它可以节省内存。请看以下示例:

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

您的内存中有多少个不同的字符串对象? 3,但都包含相同的字符。

现在采取以下行动:

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

您的内存中有多少个不同的字符串对象?只是1。所有三个变量都引用同一个字符串对象。