Skip to content

Commit

Permalink
Merge pull request #5150 from webpack/test/benchmark
Browse files Browse the repository at this point in the history
Add benchmark
  • Loading branch information
sokra committed Jul 24, 2017
2 parents bb0f41a + 544fee4 commit d4f3bc3
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 55 deletions.
22 changes: 22 additions & 0 deletions benchmark/createBenchmark.js
@@ -0,0 +1,22 @@
const webpack = require("webpack");
const path = require("path");

webpack({
context: __dirname,
entry: "./createBenchmark/entry.js",
output: {
path: __dirname,
filename: "benchmark-bundle.js"
},
target: "node",
node: {
__dirname: false
},
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.IgnorePlugin(/^(fsevents|uglify-js)$/),
new webpack.NormalModuleReplacementPlugin(/^.\/loadLoader$/, path.resolve(__dirname, "./createBenchmark/loadLoader"))
]
}, function(err, stats) {
console.log(stats.toString());
});
25 changes: 25 additions & 0 deletions benchmark/createBenchmark/entry.js
@@ -0,0 +1,25 @@
const webpack = require("webpack");
const MemoryFs = require("memory-fs");
const path = require("path");

const testCase = process.argv[2];

const config = {
context: __dirname,
entry: `./${testCase}`,
output: {
path: path.resolve(__dirname, "output-" + testCase)
},
devtool: process.argv[3]
};

const compiler = webpack(config);
compiler.run((err, stats) => {
if(err) {
console.error(err);
} else {
console.log(stats.toString({
errorDetails: true
}));
}
});
3 changes: 3 additions & 0 deletions benchmark/createBenchmark/loadLoader.js
@@ -0,0 +1,3 @@
module.exports = (loader, callback) => {
callback(new Error("Loaders are not supported"));
}
70 changes: 70 additions & 0 deletions benchmark/createTestCases.js
@@ -0,0 +1,70 @@
let avgJs = `
const str = "we" + "do" + "some" + "ops";
for(const x of str.split("")) {
if(x.charCodeAt(0) > 40) {
console.log("omg");
} else {
console.log(Math.random() * 2 + 3 * 2);
}
}
// Some comment
switch(a.b.c.d.f.e.g.h.i) {
case true:
break;
case "magic":
throw new Error("Error!");
case 9:
(function() {
// extra scope
var x = 123;
var y = 456;
var z = x + z * x / y;
x && y && (z = x ? y : x);
}())
}
function a() {}
function b() {}
function c() {}
function d() {}
function e() {}
function f() {}
`

for(var i = 0; i < 2; i++) {
avgJs += `(function() {${avgJs}}());`;
}

const fs = require("fs");
const root = __dirname;

createTree(fs, 100, `${root}/modules-100`);
createTree(fs, 500, `${root}/modules-500`);
createTree(fs, 1000, `${root}/modules-1000`);
createTree(fs, 3000, `${root}/modules-3000`);
createTree(fs, 5000, `${root}/modules-5000`);

function createTree(fs, count, folder) {
fs.mkdirSync(folder);
let remaining = count - 1;

function make(prefix, count, depth) {
if(count === 0) {
fs.writeFileSync(`${folder}/${prefix}.js`, `export default 1;\n${avgJs}`);
} else {
const list = [];
for(let i = 0; i < count; i++) {
if(remaining-- <= 0) break;
if(depth <= 4 && i >= 3 && i <= 4) {
list.push(`const module${i} = import("./${prefix}-${i}");\ncounter += module${i};`);
} else {
list.push(`import module${i} from "./${prefix}-${i}";\ncounter += module${i};`);
}
make(`${prefix}-${i}`, depth > 4 || count > 30 ? 0 : count + depth + i ** 2, depth + 1);
}
fs.writeFileSync(`${folder}/${prefix}.js`, `let counter = 0;\n${list.join("\n")};\nexport default counter;\n${avgJs}`)
}
}
make("index", 2, 0);
}
107 changes: 52 additions & 55 deletions lib/webpack.js
Expand Up @@ -58,64 +58,61 @@ webpack.validate = validateSchema.bind(this, webpackOptionsSchema);
webpack.validateSchema = validateSchema;
webpack.WebpackOptionsValidationError = WebpackOptionsValidationError;

function exportPlugins(exports, path, plugins) {
plugins.forEach(name => {
Object.defineProperty(exports, name, {
function exportPlugins(obj, mappings) {
Object.keys(mappings).forEach(name => {
Object.defineProperty(obj, name, {
configurable: false,
enumerable: true,
get() {
return require(`${path}/${name}`);
}
get: mappings[name]
});
});
}

exportPlugins(exports, ".", [
"DefinePlugin",
"NormalModuleReplacementPlugin",
"ContextReplacementPlugin",
"IgnorePlugin",
"WatchIgnorePlugin",
"BannerPlugin",
"PrefetchPlugin",
"AutomaticPrefetchPlugin",
"ProvidePlugin",
"HotModuleReplacementPlugin",
"SourceMapDevToolPlugin",
"EvalSourceMapDevToolPlugin",
"EvalDevToolModulePlugin",
"CachePlugin",
"ExtendedAPIPlugin",
"ExternalsPlugin",
"JsonpTemplatePlugin",
"LibraryTemplatePlugin",
"LoaderTargetPlugin",
"MemoryOutputFileSystem",
"ProgressPlugin",
"SetVarMainTemplatePlugin",
"UmdMainTemplatePlugin",
"NoErrorsPlugin",
"NoEmitOnErrorsPlugin",
"NewWatchingPlugin",
"EnvironmentPlugin",
"DllPlugin",
"DllReferencePlugin",
"LoaderOptionsPlugin",
"NamedModulesPlugin",
"NamedChunksPlugin",
"HashedModuleIdsPlugin",
"ModuleFilenameHelpers"
]);
exportPlugins(exports.optimize = {}, "./optimize", [
"AggressiveMergingPlugin",
"AggressiveSplittingPlugin",
"CommonsChunkPlugin",
"ChunkModuleIdRangePlugin",
"DedupePlugin",
"LimitChunkCountPlugin",
"MinChunkSizePlugin",
"ModuleConcatenationPlugin",
"OccurrenceOrderPlugin",
"UglifyJsPlugin"
]);
exportPlugins(exports.dependencies = {}, "./dependencies", []);
exportPlugins(exports, {
"DefinePlugin": () => require("./DefinePlugin"),
"NormalModuleReplacementPlugin": () => require("./NormalModuleReplacementPlugin"),
"ContextReplacementPlugin": () => require("./ContextReplacementPlugin"),
"IgnorePlugin": () => require("./IgnorePlugin"),
"WatchIgnorePlugin": () => require("./WatchIgnorePlugin"),
"BannerPlugin": () => require("./BannerPlugin"),
"PrefetchPlugin": () => require("./PrefetchPlugin"),
"AutomaticPrefetchPlugin": () => require("./AutomaticPrefetchPlugin"),
"ProvidePlugin": () => require("./ProvidePlugin"),
"HotModuleReplacementPlugin": () => require("./HotModuleReplacementPlugin"),
"SourceMapDevToolPlugin": () => require("./SourceMapDevToolPlugin"),
"EvalSourceMapDevToolPlugin": () => require("./EvalSourceMapDevToolPlugin"),
"EvalDevToolModulePlugin": () => require("./EvalDevToolModulePlugin"),
"CachePlugin": () => require("./CachePlugin"),
"ExtendedAPIPlugin": () => require("./ExtendedAPIPlugin"),
"ExternalsPlugin": () => require("./ExternalsPlugin"),
"JsonpTemplatePlugin": () => require("./JsonpTemplatePlugin"),
"LibraryTemplatePlugin": () => require("./LibraryTemplatePlugin"),
"LoaderTargetPlugin": () => require("./LoaderTargetPlugin"),
"MemoryOutputFileSystem": () => require("./MemoryOutputFileSystem"),
"ProgressPlugin": () => require("./ProgressPlugin"),
"SetVarMainTemplatePlugin": () => require("./SetVarMainTemplatePlugin"),
"UmdMainTemplatePlugin": () => require("./UmdMainTemplatePlugin"),
"NoErrorsPlugin": () => require("./NoErrorsPlugin"),
"NoEmitOnErrorsPlugin": () => require("./NoEmitOnErrorsPlugin"),
"NewWatchingPlugin": () => require("./NewWatchingPlugin"),
"EnvironmentPlugin": () => require("./EnvironmentPlugin"),
"DllPlugin": () => require("./DllPlugin"),
"DllReferencePlugin": () => require("./DllReferencePlugin"),
"LoaderOptionsPlugin": () => require("./LoaderOptionsPlugin"),
"NamedModulesPlugin": () => require("./NamedModulesPlugin"),
"NamedChunksPlugin": () => require("./NamedChunksPlugin"),
"HashedModuleIdsPlugin": () => require("./HashedModuleIdsPlugin"),
"ModuleFilenameHelpers": () => require("./ModuleFilenameHelpers")
});
exportPlugins(exports.optimize = {}, {
"AggressiveMergingPlugin": () => require("./optimize/AggressiveMergingPlugin"),
"AggressiveSplittingPlugin": () => require("./optimize/AggressiveSplittingPlugin"),
"CommonsChunkPlugin": () => require("./optimize/CommonsChunkPlugin"),
"ChunkModuleIdRangePlugin": () => require("./optimize/ChunkModuleIdRangePlugin"),
"DedupePlugin": () => require("./optimize/DedupePlugin"),
"LimitChunkCountPlugin": () => require("./optimize/LimitChunkCountPlugin"),
"MinChunkSizePlugin": () => require("./optimize/MinChunkSizePlugin"),
"ModuleConcatenationPlugin": () => require("./optimize/ModuleConcatenationPlugin"),
"OccurrenceOrderPlugin": () => require("./optimize/OccurrenceOrderPlugin"),
"UglifyJsPlugin": () => require("./optimize/UglifyJsPlugin")
});

0 comments on commit d4f3bc3

Please sign in to comment.