From abc9fda0e81397c754fabc0fc904ebfe224d821c Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Tue, 17 May 2016 18:43:13 -0700 Subject: [PATCH] Conditionally enable performance metrics --- src/compiler/binder.ts | 6 +++--- src/compiler/checker.ts | 6 +++--- src/compiler/core.ts | 34 +++++++++++++++++++++++++--------- src/compiler/program.ts | 24 ++++++++++++------------ src/compiler/tsc.ts | 19 ++++++++++++------- 5 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 1619fc0fc8..0424d3b7f4 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -94,10 +94,10 @@ namespace ts { const binder = createBinder(); export function bindSourceFile(file: SourceFile, options: CompilerOptions) { - Performance.mark("bindStart"); + performance.mark("bindStart"); binder(file, options); - Performance.mark("bindEnd"); - Performance.measure("bindTime", "bindStart", "bindEnd"); + performance.mark("bindEnd"); + performance.measure("bindTime", "bindStart", "bindEnd"); } function createBinder(): (file: SourceFile, options: CompilerOptions) => void { diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 725ed2c1ba..755b285266 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -16064,12 +16064,12 @@ namespace ts { } function checkSourceFile(node: SourceFile) { - Performance.mark("checkStart"); + performance.mark("checkStart"); checkSourceFileWorker(node); - Performance.mark("checkEnd"); - Performance.measure("checkTime", "checkStart", "checkEnd"); + performance.mark("checkEnd"); + performance.measure("checkTime", "checkStart", "checkEnd"); } // Fully type check a source file and collect the relevant diagnostics. diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 0a07084490..1e8e66739c 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1134,8 +1134,9 @@ namespace ts { : ((fileName) => fileName.toLowerCase()); } + /** Performance measurements for the compiler. */ /*@internal*/ - export namespace Performance { + export namespace performance { interface MarkData { markName: string; timestamp: number; @@ -1159,6 +1160,7 @@ namespace ts { const measures: MeasureData[] = []; let start = now(); + let enabled = false; /** Gets the current timer for performance measurements. */ export function now() { @@ -1172,7 +1174,9 @@ namespace ts { * @param markName The name of the performance mark. */ export function mark(markName: string) { - marks.push({ markName, timestamp: now() }); + if (enabled) { + marks.push({ markName, timestamp: now() }); + } } /** @@ -1188,13 +1192,15 @@ namespace ts { * If not specified, the current time is used. */ export function measure(measureName: string, startMarkName?: string, endMarkName?: string) { - measures.push({ - measureName, - startMarkName, - endMarkName, - timestamp: now(), - marksOffset: marks.length - }); + if (enabled) { + measures.push({ + measureName, + startMarkName, + endMarkName, + timestamp: now(), + marksOffset: marks.length + }); + } } /** @@ -1268,5 +1274,15 @@ namespace ts { measures.length = 0; start = now(); } + + /** Enables performance measurements for the compiler. */ + export function enable() { + enabled = true; + } + + /** Disables performance measurements for the compiler. */ + export function disable() { + enabled = false; + } } } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 1e7d4118e6..1346a8c026 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -776,10 +776,10 @@ namespace ts { function getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile { let text: string; try { - Performance.mark("ioReadStart"); + performance.mark("ioReadStart"); text = sys.readFile(fileName, options.charset); - Performance.mark("ioReadEnd"); - Performance.measure("ioReadTime", "ioReadStart", "ioReadEnd"); + performance.mark("ioReadEnd"); + performance.measure("ioReadTime", "ioReadStart", "ioReadEnd"); } catch (e) { if (onError) { @@ -846,7 +846,7 @@ namespace ts { function writeFile(fileName: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) { try { - Performance.mark("ioWriteStart"); + performance.mark("ioWriteStart"); ensureDirectoriesExist(getDirectoryPath(normalizePath(fileName))); if (isWatchSet(options) && sys.createHash && sys.getModifiedTime) { @@ -856,8 +856,8 @@ namespace ts { sys.writeFile(fileName, data, writeByteOrderMark); } - Performance.mark("ioWriteEnd"); - Performance.measure("ioWriteTime", "ioWriteStart", "ioWriteEnd"); + performance.mark("ioWriteEnd"); + performance.measure("ioWriteTime", "ioWriteStart", "ioWriteEnd"); } catch (e) { if (onError) { @@ -959,7 +959,7 @@ namespace ts { let resolvedTypeReferenceDirectives: Map = {}; let fileProcessingDiagnostics = createDiagnosticCollection(); - Performance.mark("programStart"); + performance.mark("programStart"); host = host || createCompilerHost(options); @@ -1052,8 +1052,8 @@ namespace ts { verifyCompilerOptions(); - Performance.mark("programEnd"); - Performance.measure("programTime", "programStart", "programEnd"); + performance.mark("programEnd"); + performance.measure("programTime", "programStart", "programEnd"); return program; @@ -1286,7 +1286,7 @@ namespace ts { // checked is to not pass the file to getEmitResolver. const emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver((options.outFile || options.out) ? undefined : sourceFile); - Performance.mark("emitStart"); + performance.mark("emitStart"); // TODO(rbuckton): remove USE_TRANSFORMS condition when we switch to transforms permanently. let useLegacyEmitter = options.useLegacyEmitter; @@ -1300,8 +1300,8 @@ namespace ts { getEmitHost(writeFileCallback), sourceFile); - Performance.mark("emitEnd"); - Performance.measure("emitTime", "emitStart", "emitEnd"); + performance.mark("emitEnd"); + performance.measure("emitTime", "emitStart", "emitEnd"); return emitResult; } diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 2325f75a66..27b098d011 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -544,7 +544,10 @@ namespace ts { } function compile(fileNames: string[], compilerOptions: CompilerOptions, compilerHost: CompilerHost) { - Performance.reset(); + if (compilerOptions.diagnostics) { + performance.enable(); + performance.reset(); + } const program = createProgram(fileNames, compilerOptions, compilerHost); const exitStatus = compileProgram(); @@ -556,12 +559,14 @@ namespace ts { } if (compilerOptions.diagnostics) { - const ioReadTime = reduceLeft(Performance.getMeasures("ioReadTime"), (aggregate, measure) => aggregate + measure.duration, 0); - const ioWriteTime = reduceLeft(Performance.getMeasures("ioWriteTime"), (aggregate, measure) => aggregate + measure.duration, 0); - const programTime = reduceLeft(Performance.getMeasures("programTime"), (aggregate, measure) => aggregate + measure.duration, 0); - const bindTime = reduceLeft(Performance.getMeasures("bindTime"), (aggregate, measure) => aggregate + measure.duration, 0); - const checkTime = reduceLeft(Performance.getMeasures("checkTime"), (aggregate, measure) => aggregate + measure.duration, 0); - const emitTime = reduceLeft(Performance.getMeasures("emitTime"), (aggregate, measure) => aggregate + measure.duration, 0); + const ioReadTime = reduceLeft(performance.getMeasures("ioReadTime"), (aggregate, measure) => aggregate + measure.duration, 0); + const ioWriteTime = reduceLeft(performance.getMeasures("ioWriteTime"), (aggregate, measure) => aggregate + measure.duration, 0); + const programTime = reduceLeft(performance.getMeasures("programTime"), (aggregate, measure) => aggregate + measure.duration, 0); + const bindTime = reduceLeft(performance.getMeasures("bindTime"), (aggregate, measure) => aggregate + measure.duration, 0); + const checkTime = reduceLeft(performance.getMeasures("checkTime"), (aggregate, measure) => aggregate + measure.duration, 0); + const emitTime = reduceLeft(performance.getMeasures("emitTime"), (aggregate, measure) => aggregate + measure.duration, 0); + performance.disable(); + performance.reset(); const memoryUsed = sys.getMemoryUsage ? sys.getMemoryUsage() : -1; reportCountStatistic("Files", program.getSourceFiles().length);