mirror of https://github.com/webpack/webpack.git
profiling is back
This commit is contained in:
parent
5cdb8cbf81
commit
30c66003e8
|
@ -61,6 +61,8 @@ module.exports = function(optimist) {
|
||||||
|
|
||||||
.boolean("bail").describe("bail")
|
.boolean("bail").describe("bail")
|
||||||
|
|
||||||
|
.boolean("profile").describe("profile")
|
||||||
|
|
||||||
.boolean("d").describe("d", "shortcut for --debug --devtool sourcemap --output-pathinfo")
|
.boolean("d").describe("d", "shortcut for --debug --devtool sourcemap --output-pathinfo")
|
||||||
|
|
||||||
.boolean("p").describe("p", "shortcut for --optimize-minimize");
|
.boolean("p").describe("p", "shortcut for --optimize-minimize");
|
||||||
|
|
|
@ -274,6 +274,8 @@ module.exports = function(optimist, argv, convertOptions) {
|
||||||
|
|
||||||
mapArgToBoolean("bail", "bail");
|
mapArgToBoolean("bail", "bail");
|
||||||
|
|
||||||
|
mapArgToBoolean("profile", "profile");
|
||||||
|
|
||||||
if(!options.output || !options.output.filename) {
|
if(!options.output || !options.output.filename) {
|
||||||
ensureObject(options, "output");
|
ensureObject(options, "output");
|
||||||
if(convertOptions && convertOptions.outputFilename) {
|
if(convertOptions && convertOptions.outputFilename) {
|
||||||
|
|
|
@ -27,6 +27,7 @@ function Compilation(compiler) {
|
||||||
var options = this.options = compiler.options;
|
var options = this.options = compiler.options;
|
||||||
this.outputOptions = options && options.output;
|
this.outputOptions = options && options.output;
|
||||||
this.bail = options && options.bail;
|
this.bail = options && options.bail;
|
||||||
|
this.profile = options && options.profile;
|
||||||
this.entries = [];
|
this.entries = [];
|
||||||
this.chunks = [];
|
this.chunks = [];
|
||||||
this.namedChunks = {};
|
this.namedChunks = {};
|
||||||
|
@ -154,6 +155,7 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
|
||||||
}.bind(this);
|
}.bind(this);
|
||||||
|
|
||||||
var factory = item[0];
|
var factory = item[0];
|
||||||
|
if(this.profile) var start = +new Date();
|
||||||
factory.create(module.context, dependencies[0], function(err, dependantModule) {
|
factory.create(module.context, dependencies[0], function(err, dependantModule) {
|
||||||
function isOptional() {
|
function isOptional() {
|
||||||
return dependencies.filter(function(d) { return !d.optional }).length == 0;
|
return dependencies.filter(function(d) { return !d.optional }).length == 0;
|
||||||
|
@ -166,7 +168,13 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
|
||||||
}
|
}
|
||||||
if(err) return errorOrWarningAndCallback(new ModuleNotFoundError(module, err));
|
if(err) return errorOrWarningAndCallback(new ModuleNotFoundError(module, err));
|
||||||
if(!dependantModule) return callback();
|
if(!dependantModule) return callback();
|
||||||
|
if(this.profile) {
|
||||||
|
if(!dependantModule.profile) dependantModule.profile = {};
|
||||||
|
var afterFactory = +new Date();
|
||||||
|
dependantModule.profile.factory = afterFactory - start;
|
||||||
|
}
|
||||||
|
|
||||||
|
dependantModule.issuer = module.identifier();
|
||||||
var newModule = this.addModule(dependantModule);
|
var newModule = this.addModule(dependantModule);
|
||||||
|
|
||||||
if(!newModule) {
|
if(!newModule) {
|
||||||
|
@ -177,10 +185,21 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
|
||||||
dependantModule.addReason(module, dep);
|
dependantModule.addReason(module, dep);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(this.profile) {
|
||||||
|
if(!module.profile) module.profile = {};
|
||||||
|
var time = +new Date() - start;
|
||||||
|
if(!module.profile.dependencies || time > module.profile.dependencies)
|
||||||
|
module.profile.dependencies = time;
|
||||||
|
}
|
||||||
|
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(newModule instanceof Module) { // from cache
|
if(newModule instanceof Module) { // from cache
|
||||||
|
if(this.profile)
|
||||||
|
newModule.profile = dependantModule.profile;
|
||||||
|
|
||||||
|
newModule.issuer = dependantModule.issuer;
|
||||||
dependantModule = newModule;
|
dependantModule = newModule;
|
||||||
|
|
||||||
dependencies.forEach(function(dep) {
|
dependencies.forEach(function(dep) {
|
||||||
|
@ -199,6 +218,11 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
|
||||||
dependantModule.addReason(module, dep);
|
dependantModule.addReason(module, dep);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(this.profile) {
|
||||||
|
var afterBuilding = +new Date();
|
||||||
|
dependantModule.profile.building = afterBuilding - afterFactory;
|
||||||
|
}
|
||||||
|
|
||||||
this.processModuleDependencies(dependantModule, callback);
|
this.processModuleDependencies(dependantModule, callback);
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|
||||||
|
|
73
lib/Stats.js
73
lib/Stats.js
|
@ -116,7 +116,9 @@ Stats.prototype.toJson = function toJson(options, forToString) {
|
||||||
built: !!module.built,
|
built: !!module.built,
|
||||||
chunks: module.chunks.map(function(chunk) {
|
chunks: module.chunks.map(function(chunk) {
|
||||||
return chunk.id;
|
return chunk.id;
|
||||||
})
|
}),
|
||||||
|
issuer: module.issuer,
|
||||||
|
profile: module.profile
|
||||||
};
|
};
|
||||||
if(showReasons) {
|
if(showReasons) {
|
||||||
obj.reasons = module.reasons.filter(function(reason) {
|
obj.reasons = module.reasons.filter(function(reason) {
|
||||||
|
@ -227,6 +229,22 @@ Stats.jsonToString = function jsonToString(obj, useColors) {
|
||||||
buf.push(str);
|
buf.push(str);
|
||||||
if(useColors) buf.push("\033[39m\033[22m");
|
if(useColors) buf.push("\033[39m\033[22m");
|
||||||
}
|
}
|
||||||
|
function coloredTime(time) {
|
||||||
|
var times = [800, 400, 200, 100];
|
||||||
|
if(obj.time) {
|
||||||
|
times = [obj.time/2, obj.time/4, obj.time/8, obj.time/16];
|
||||||
|
}
|
||||||
|
if(time < times[3])
|
||||||
|
normal(time + "ms");
|
||||||
|
else if(time < times[2])
|
||||||
|
bold(time + "ms");
|
||||||
|
else if(time < times[1])
|
||||||
|
green(time + "ms");
|
||||||
|
else if(time < times[0])
|
||||||
|
yellow(time + "ms");
|
||||||
|
else
|
||||||
|
red(time + "ms");
|
||||||
|
}
|
||||||
function newline() {
|
function newline() {
|
||||||
buf.push("\n");
|
buf.push("\n");
|
||||||
}
|
}
|
||||||
|
@ -291,6 +309,57 @@ Stats.jsonToString = function jsonToString(obj, useColors) {
|
||||||
});
|
});
|
||||||
table(t, [green, normal, bold, green, normal], "rrrll");
|
table(t, [green, normal, bold, green, normal], "rrrll");
|
||||||
}
|
}
|
||||||
|
var modulesByIdentifier = {};
|
||||||
|
if(obj.modules) {
|
||||||
|
obj.modules.forEach(function(module) {
|
||||||
|
modulesByIdentifier["$"+module.identifier] = module;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
obj.chunks.forEach(function(chunk) {
|
||||||
|
chunk.modules.forEach(function(module) {
|
||||||
|
modulesByIdentifier["$"+module.identifier] = module;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function processProfile(module) {
|
||||||
|
if(module.profile) {
|
||||||
|
normal(" ");
|
||||||
|
var sum = 0, allowSum = true;
|
||||||
|
var path = [];
|
||||||
|
var current = module;
|
||||||
|
while(current.issuer) {
|
||||||
|
if(!modulesByIdentifier["$"+current.issuer]) {
|
||||||
|
normal(" ... ->");
|
||||||
|
allowSum = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
path.unshift(current = modulesByIdentifier["$"+current.issuer]);
|
||||||
|
}
|
||||||
|
path.forEach(function(module) {
|
||||||
|
normal(" [");
|
||||||
|
normal(module.id);
|
||||||
|
normal("] ");
|
||||||
|
if(module.profile) {
|
||||||
|
var time = (module.profile.factory || 0) + (module.profile.building || 0);
|
||||||
|
coloredTime(time);
|
||||||
|
sum += time;
|
||||||
|
normal(" ");
|
||||||
|
}
|
||||||
|
normal("->");
|
||||||
|
});
|
||||||
|
Object.keys(module.profile).forEach(function(key) {
|
||||||
|
normal(" " + key + ":");
|
||||||
|
var time = module.profile[key];
|
||||||
|
coloredTime(time);
|
||||||
|
sum += time;
|
||||||
|
});
|
||||||
|
if(allowSum) {
|
||||||
|
normal(" = ");
|
||||||
|
coloredTime(sum);
|
||||||
|
}
|
||||||
|
newline();
|
||||||
|
}
|
||||||
|
}
|
||||||
if(obj.chunks) {
|
if(obj.chunks) {
|
||||||
obj.chunks.forEach(function(chunk) {
|
obj.chunks.forEach(function(chunk) {
|
||||||
normal("chunk ");
|
normal("chunk ");
|
||||||
|
@ -360,6 +429,7 @@ Stats.jsonToString = function jsonToString(obj, useColors) {
|
||||||
newline();
|
newline();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
processProfile(module);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -406,6 +476,7 @@ Stats.jsonToString = function jsonToString(obj, useColors) {
|
||||||
newline();
|
newline();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
processProfile(module);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if(obj.warnings) {
|
if(obj.warnings) {
|
||||||
|
|
Loading…
Reference in New Issue