Skip to content

Commit c2478e0

Browse files
authored
perf(core): cache TraceMap and parsed sourcemaps, use Set for coverage file lookup (#1074)
1 parent 68bb4a4 commit c2478e0

File tree

3 files changed

+30
-12
lines changed

3 files changed

+30
-12
lines changed

packages/core/src/coverage/generate.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export async function generateCoverage(
7474
}
7575

7676
if (coverage.include?.length) {
77-
const coveredFiles = finalCoverageMap.files().map(normalize);
77+
const coveredFilesSet = new Set(finalCoverageMap.files().map(normalize));
7878

7979
let isTimeout = false;
8080

@@ -89,7 +89,7 @@ export async function generateCoverage(
8989
const includedFiles = await getIncludedFiles(coverage, p.rootPath);
9090

9191
const uncoveredFiles = includedFiles.filter(
92-
(file) => !coveredFiles.includes(normalize(file)),
92+
(file) => !coveredFilesSet.has(normalize(file)),
9393
);
9494

9595
if (uncoveredFiles.length) {
@@ -113,7 +113,8 @@ export async function generateCoverage(
113113
}
114114

115115
// should be better to filter files before swc coverage is processed
116-
finalCoverageMap.filter((file) => allFiles.includes(normalize(file)));
116+
const allFilesSet = new Set(allFiles.map(normalize));
117+
finalCoverageMap.filter((file) => allFilesSet.has(normalize(file)));
117118
}
118119

119120
// Generate coverage reports

packages/core/src/reporter/md.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,10 @@ const parseErrorStacktrace = async ({
749749
getSourcemap?: GetSourcemap;
750750
fullStack?: boolean;
751751
}): Promise<StackFrame[]> => {
752+
// Cache TraceMap per file to avoid redundant VLQ decoding when multiple
753+
// stack frames originate from the same source file.
754+
const traceMapCache = new Map<string, TraceMap>();
755+
752756
const frames = parseStackTrace(stack)
753757
.filter((frame) => {
754758
if (fullStack) return true;
@@ -778,7 +782,11 @@ const parseErrorStacktrace = async ({
778782
};
779783
}
780784

781-
const traceMap = new TraceMap(sourcemap);
785+
let traceMap = traceMapCache.get(file);
786+
if (!traceMap) {
787+
traceMap = new TraceMap(sourcemap);
788+
traceMapCache.set(file, traceMap);
789+
}
782790
const { line, column, source, name } = originalPositionFor(traceMap, {
783791
line: frame.lineNumber || 1,
784792
column: frame.column || 1,
@@ -1195,13 +1203,14 @@ export class MdReporter implements Reporter {
11951203
})
11961204
: [];
11971205

1198-
const fullFrames = error.stack
1199-
? await parseErrorStacktrace({
1200-
stack: error.stack,
1201-
getSourcemap,
1202-
fullStack: error.fullStack,
1203-
})
1204-
: candidateFrames;
1206+
const fullFrames =
1207+
error.fullStack && error.stack
1208+
? await parseErrorStacktrace({
1209+
stack: error.stack,
1210+
getSourcemap,
1211+
fullStack: true,
1212+
})
1213+
: candidateFrames;
12051214

12061215
const trimmedFrames = resolveStackFrames(fullFrames, this.options);
12071216
const topFrame = fullFrames[0] ?? candidateFrames[0];

packages/core/src/utils/error.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ export async function parseErrorStacktrace({
166166
stack: string;
167167
getSourcemap?: GetSourcemap;
168168
}): Promise<StackFrame[]> {
169+
// Cache TraceMap per file to avoid redundant VLQ decoding when multiple
170+
// stack frames originate from the same source file.
171+
const traceMapCache = new Map<string, TraceMap>();
172+
169173
const stackFrames = await Promise.all(
170174
stackTraceParse(stack)
171175
.filter((frame) =>
@@ -177,7 +181,11 @@ export async function parseErrorStacktrace({
177181
.map(async (frame) => {
178182
const sourcemap = await getSourcemap?.(frame.file!);
179183
if (sourcemap) {
180-
const traceMap = new TraceMap(sourcemap);
184+
let traceMap = traceMapCache.get(frame.file!);
185+
if (!traceMap) {
186+
traceMap = new TraceMap(sourcemap);
187+
traceMapCache.set(frame.file!, traceMap);
188+
}
181189
const { line, column, source, name } = originalPositionFor(traceMap, {
182190
line: frame.lineNumber!,
183191
column: frame.column!,

0 commit comments

Comments
 (0)