From 6ea3fb36c45038e92e5f702832f2fa932ba1d4bf Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:39:44 -0700 Subject: [PATCH 1/3] Cache enum members for Debug.format functions --- src/compiler/debug.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/compiler/debug.ts b/src/compiler/debug.ts index 81493c6d8e7e8..03485520c5dcb 100644 --- a/src/compiler/debug.ts +++ b/src/compiler/debug.ts @@ -326,7 +326,17 @@ namespace ts { return value.toString(); } + const enumMemberCache = new Map>(); + function getEnumMembers(enumObject: any) { + // Assuming enum objects do not change at runtime, we can cache the enum members list + // to reuse later. This saves us from reconstructing this each and every time we call + // a formatting function (which can be expensive for large enums like SyntaxKind). + const existing = enumMemberCache.get(enumObject); + if (existing) { + return existing; + } + const result: [number, string][] = []; for (const name in enumObject) { const value = enumObject[name]; @@ -335,9 +345,12 @@ namespace ts { } } - return stableSort<[number, string]>(result, (x, y) => compareValues(x[0], y[0])); + const sorted = stableSort<[number, string]>(result, (x, y) => compareValues(x[0], y[0])); + enumMemberCache.set(enumObject, sorted); + return sorted; } + export function formatSyntaxKind(kind: SyntaxKind | undefined): string { return formatEnum(kind, (ts as any).SyntaxKind, /*isFlags*/ false); } From c5b48babc0d721378512d9fbfd905cbaf8ee3f9d Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:50:59 -0700 Subject: [PATCH 2/3] Use an array join rather than temporary strings in formatEnum --- src/compiler/debug.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/debug.ts b/src/compiler/debug.ts index 03485520c5dcb..55b50304f93ec 100644 --- a/src/compiler/debug.ts +++ b/src/compiler/debug.ts @@ -301,19 +301,19 @@ namespace ts { return members.length > 0 && members[0][0] === 0 ? members[0][1] : "0"; } if (isFlags) { - let result = ""; + const result: string[] = []; let remainingFlags = value; for (const [enumValue, enumName] of members) { if (enumValue > value) { break; } if (enumValue !== 0 && enumValue & value) { - result = `${result}${result ? "|" : ""}${enumName}`; + result.push(enumName); remainingFlags &= ~enumValue; } } if (remainingFlags === 0) { - return result; + return result.join("|"); } } else { From fca4519ce492c170596860ad37f6ba2a01050afd Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:53:05 -0700 Subject: [PATCH 3/3] Formatting --- src/compiler/debug.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/debug.ts b/src/compiler/debug.ts index 55b50304f93ec..d4644cd769bda 100644 --- a/src/compiler/debug.ts +++ b/src/compiler/debug.ts @@ -350,7 +350,6 @@ namespace ts { return sorted; } - export function formatSyntaxKind(kind: SyntaxKind | undefined): string { return formatEnum(kind, (ts as any).SyntaxKind, /*isFlags*/ false); }