From 38c24798e4c0e3232fd224e1bcbedee07feab6c2 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 10 Aug 2015 10:44:48 -0700 Subject: [PATCH] Added performance metrics for transform and flags for types --- src/compiler/transform.ts | 30 ++++++++++++++++++++++++++++++ src/compiler/transforms/chain.ts | 5 +++++ src/compiler/tsc.ts | 6 +++++- src/compiler/types.ts | 3 +++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/compiler/transform.ts b/src/compiler/transform.ts index f49b3eafa17..568cf1d839e 100644 --- a/src/compiler/transform.ts +++ b/src/compiler/transform.ts @@ -2,6 +2,9 @@ /// /* @internal */ namespace ts.transform { + + /* @internal */ export let aggregateTime = 0; + // Flags enum to track count of temp variables and a few dedicated names const enum TempFlags { Auto = 0x00000000, // No preferred name @@ -40,6 +43,8 @@ namespace ts.transform { function aggregateTransformFlagsForNode(node: Node) { forEachChild(node, aggregateTransformFlagsForChildNode); + let start = new Date().getTime(); + if (node.flags & NodeFlags.Ambient) { transformFlags |= TransformFlags.ThisNodeIsTypeScript; } @@ -281,9 +286,34 @@ namespace ts.transform { case SyntaxKind.ExportDeclaration: transformFlags |= TransformFlags.ThisNodeIsES6; break; + + case SyntaxKind.AnyKeyword: + case SyntaxKind.NumberKeyword: + case SyntaxKind.StringKeyword: + case SyntaxKind.BooleanKeyword: + case SyntaxKind.SymbolKeyword: + case SyntaxKind.TypeParameter: + case SyntaxKind.CallSignature: + case SyntaxKind.ConstructSignature: + case SyntaxKind.IndexSignature: + case SyntaxKind.MethodSignature: + case SyntaxKind.PropertySignature: + transformFlags |= TransformFlags.ThisNodeIsTypeScript; + node.excludeTransformFlags = TransformFlags.TypeExcludes; + break; + + default: + if (SyntaxKind.FirstTypeNode <= node.kind && node.kind <= SyntaxKind.LastTypeNode) { + transformFlags |= TransformFlags.ThisNodeIsTypeScript; + node.excludeTransformFlags = TransformFlags.TypeExcludes; + } + break; + } node.transformFlags = transformFlags; + + aggregateTime += new Date().getTime() - start; } export class VisitorContext { diff --git a/src/compiler/transforms/chain.ts b/src/compiler/transforms/chain.ts index b398211f985..bc28e53d726 100644 --- a/src/compiler/transforms/chain.ts +++ b/src/compiler/transforms/chain.ts @@ -4,6 +4,9 @@ /// /*@internal*/ namespace ts.transform { + + export let transformTime = 0; + export type TransformationChain = (context: VisitorContext, statements: NodeArray) => NodeArray; export function getTransformationChain(options: CompilerOptions): TransformationChain { @@ -25,6 +28,7 @@ namespace ts.transform { } function runTransformation(chain: TransformationChain, context: VisitorContext, statements: NodeArray) { + let start = new Date().getTime(); context.pushLexicalEnvironment(); let transformed = chain(context, statements); @@ -34,6 +38,7 @@ namespace ts.transform { } context.popLexicalEnvironment(); + transformTime += new Date().getTime() - start; return transformed; } diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 8fc69d70e38..9ec1b187c67 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -118,7 +118,7 @@ namespace ts { } function reportStatisticalValue(name: string, value: string) { - sys.write(padRight(name + ":", 12) + padLeft(value.toString(), 10) + sys.newLine); + sys.write(padRight(name + ":", 20) + padLeft(value.toString(), 10) + sys.newLine); } function reportCountStatistic(name: string, count: number) { @@ -316,6 +316,8 @@ namespace ts { bindTime = 0; checkTime = 0; emitTime = 0; + transform.aggregateTime = 0; + transform.transformTime = 0; let program = createProgram(fileNames, compilerOptions, compilerHost); let exitStatus = compileProgram(); @@ -348,6 +350,8 @@ namespace ts { reportTimeStatistic("Parse time", programTime); reportTimeStatistic("Bind time", bindTime); reportTimeStatistic("Check time", checkTime); + reportTimeStatistic("Pre-transform time", transform.aggregateTime); + reportTimeStatistic("Transform time", transform.transformTime); reportTimeStatistic("Emit time", emitTime); reportTimeStatistic("Total time", programTime + bindTime + checkTime + emitTime); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 35dc62f0849..8bcb8f9e2e3 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -623,6 +623,9 @@ namespace ts { ContainsES6VariableBindingPattern | ContainsES6ParameterBindingPattern, + TypeExcludes = + ~ContainsTypeScript, + CallOrArrayLiteralExcludes = ContainsES6SpreadElement, }