Added performance metrics for transform and flags for types

This commit is contained in:
Ron Buckton 2015-08-10 10:44:48 -07:00
parent e984fb80b6
commit 38c24798e4
4 changed files with 43 additions and 1 deletions

View file

@ -2,6 +2,9 @@
/// <reference path="transform.generated.ts" />
/* @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 {

View file

@ -4,6 +4,9 @@
/// <reference path="es5.ts" />
/*@internal*/
namespace ts.transform {
export let transformTime = 0;
export type TransformationChain = (context: VisitorContext, statements: NodeArray<Statement>) => NodeArray<Statement>;
export function getTransformationChain(options: CompilerOptions): TransformationChain {
@ -25,6 +28,7 @@ namespace ts.transform {
}
function runTransformation(chain: TransformationChain, context: VisitorContext, statements: NodeArray<Statement>) {
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;
}

View file

@ -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);
}

View file

@ -623,6 +623,9 @@ namespace ts {
ContainsES6VariableBindingPattern |
ContainsES6ParameterBindingPattern,
TypeExcludes =
~ContainsTypeScript,
CallOrArrayLiteralExcludes =
ContainsES6SpreadElement,
}