diff --git a/lib/Compilation.js b/lib/Compilation.js index b56424b30..4f4d43b81 100644 --- a/lib/Compilation.js +++ b/lib/Compilation.js @@ -2063,6 +2063,8 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o } codeGeneration(callback) { + let statModulesFromCache = 0; + let statModulesGenerated = 0; const { chunkGraph, moduleGraph, @@ -2113,6 +2115,7 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o if (err) return callback(err); let result; if (!cachedResult) { + statModulesGenerated++; try { result = module.codeGeneration({ chunkGraph, @@ -2129,6 +2132,7 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o }; } } else { + statModulesFromCache++; result = cachedResult; } for (const runtime of runtimes) { @@ -2151,6 +2155,12 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o this.errors.push(error); } } + this.logger.log( + `${Math.round( + (100 * statModulesGenerated) / + (statModulesGenerated + statModulesFromCache) + )}% code generated (${statModulesGenerated} generated, ${statModulesFromCache} from cache)` + ); callback(); } ); @@ -2512,10 +2522,12 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o } createModuleHashes() { + let statModulesHashed = 0; const chunkGraph = this.chunkGraph; const { hashFunction, hashDigest, hashDigestLength } = this.outputOptions; for (const module of this.modules) { for (const runtime of chunkGraph.getModuleRuntimes(module)) { + statModulesHashed++; const moduleHash = createHash(hashFunction); module.updateHash(moduleHash, { chunkGraph, @@ -2532,6 +2544,11 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o ); } } + this.logger.log( + `${statModulesHashed} modules hashed (${ + Math.round((100 * statModulesHashed) / this.modules.size) / 100 + } variants per module in average)` + ); } createHash() { diff --git a/lib/FlagDependencyExportsPlugin.js b/lib/FlagDependencyExportsPlugin.js index 400f9f926..31b65dbc5 100644 --- a/lib/FlagDependencyExportsPlugin.js +++ b/lib/FlagDependencyExportsPlugin.js @@ -33,6 +33,10 @@ class FlagDependencyExportsPlugin { const logger = compilation.getLogger( "webpack.FlagDependencyExportsPlugin" ); + let statRestoredFromCache = 0; + let statFlaggedUncached = 0; + let statNotCached = 0; + let statQueueItemsProcessed = 0; /** @type {Queue} */ const queue = new Queue(); @@ -46,6 +50,7 @@ class FlagDependencyExportsPlugin { module.buildInfo.cacheable !== true || typeof module.buildInfo.hash !== "string" ) { + statFlaggedUncached++; // Enqueue uncacheable module for determining the exports queue.enqueue(module); moduleGraph.getExportsInfo(module).setHasProvideInfo(); @@ -58,10 +63,12 @@ class FlagDependencyExportsPlugin { if (err) return callback(err); if (result !== undefined) { + statRestoredFromCache++; moduleGraph .getExportsInfo(module) .restoreProvided(result); } else { + statNotCached++; // Without cached info enqueue module for determining the exports queue.enqueue(module); moduleGraph.getExportsInfo(module).setHasProvideInfo(); @@ -256,6 +263,8 @@ class FlagDependencyExportsPlugin { while (queue.length > 0) { module = queue.dequeue(); + statQueueItemsProcessed++; + exportsInfo = moduleGraph.getExportsInfo(module); if (!module.buildMeta || !module.buildMeta.exportsType) { if (exportsInfo.otherExportsInfo.provided !== null) { @@ -283,6 +292,20 @@ class FlagDependencyExportsPlugin { } logger.timeEnd("figure out provided exports"); + logger.log( + `${Math.round( + 100 - + (100 * statRestoredFromCache) / + (statRestoredFromCache + + statNotCached + + statFlaggedUncached) + )}% of exports of modules have been determined (${statNotCached} not cached, ${statFlaggedUncached} flagged uncacheable, ${statRestoredFromCache} from cache, ${ + statQueueItemsProcessed - + statNotCached - + statFlaggedUncached + } additional calculations due to dependencies)` + ); + logger.time("store provided exports into cache"); asyncLib.each( modulesToStore, diff --git a/lib/buildChunkGraph.js b/lib/buildChunkGraph.js index d536bb6eb..71c67873e 100644 --- a/lib/buildChunkGraph.js +++ b/lib/buildChunkGraph.js @@ -936,14 +936,14 @@ const visitModules = ( } logger.log( - `Statistics: ${statProcessedQueueItems} queue items processed (${statProcessedBlocks} blocks)` + `${statProcessedQueueItems} queue items processed (${statProcessedBlocks} blocks)` ); - logger.log(`Statistics: ${statConnectedChunkGroups} chunk groups connected`); + logger.log(`${statConnectedChunkGroups} chunk groups connected`); logger.log( - `Statistics: ${statProcessedChunkGroupsForMerging} chunk groups processed for merging (${statMergedAvailableModuleSets} module sets, ${statForkedAvailableModules} forked, ${statForkedAvailableModulesCount} + ${statForkedAvailableModulesCountPlus} modules forked, ${statForkedMergedModulesCount} + ${statForkedMergedModulesCountPlus} modules merged into fork, ${statForkedResultModulesCount} resulting modules)` + `${statProcessedChunkGroupsForMerging} chunk groups processed for merging (${statMergedAvailableModuleSets} module sets, ${statForkedAvailableModules} forked, ${statForkedAvailableModulesCount} + ${statForkedAvailableModulesCountPlus} modules forked, ${statForkedMergedModulesCount} + ${statForkedMergedModulesCountPlus} modules merged into fork, ${statForkedResultModulesCount} resulting modules)` ); logger.log( - `Statistics: ${statChunkGroupInfoUpdated} chunk group info updated (${statChildChunkGroupsReconnected} already connected chunk groups reconnected)` + `${statChunkGroupInfoUpdated} chunk group info updated (${statChildChunkGroupsReconnected} already connected chunk groups reconnected)` ); }; diff --git a/lib/cache/ResolverCachePlugin.js b/lib/cache/ResolverCachePlugin.js index 0e3179eef..d90711ede 100644 --- a/lib/cache/ResolverCachePlugin.js +++ b/lib/cache/ResolverCachePlugin.js @@ -103,7 +103,7 @@ class ResolverCachePlugin { compilation.hooks.finishModules.tap("ResolverCachePlugin", () => { if (realResolves + cachedResolves > 0) { const logger = compilation.getLogger("webpack.ResolverCachePlugin"); - logger.debug( + logger.log( `${Math.round( (100 * realResolves) / (realResolves + cachedResolves) )}% really resolved (${realResolves} real resolves with ${cacheInvalidResolves} cached but invalid, ${cachedResolves} cached valid, ${concurrentResolves} concurrent)` diff --git a/test/__snapshots__/StatsTestCases.test.js.snap b/test/__snapshots__/StatsTestCases.test.js.snap index a2914f2fc..dd11130f7 100644 --- a/test/__snapshots__/StatsTestCases.test.js.snap +++ b/test/__snapshots__/StatsTestCases.test.js.snap @@ -1362,11 +1362,20 @@ Entrypoint main = main.js DEBUG LOG from ./node_modules/custom-loader/index.js Named Logger ./node_modules/custom-loader/index.js!./index.js Message with named logger +LOG from webpack.FlagDependencyExportsPlugin + 100% of exports of modules have been determined (1 not cached, 0 flagged uncacheable, 0 from cache, 0 additional calculations due to dependencies) ++ 3 hidden lines + +LOG from webpack.Compilation + 1 modules hashed (1 variants per module in average) + 100% code generated (1 generated, 0 from cache) ++ 19 hidden lines + LOG from webpack.buildChunkGraph - Statistics: 2 queue items processed (1 blocks) - Statistics: 0 chunk groups connected - Statistics: 0 chunk groups processed for merging (0 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) - Statistics: 0 chunk group info updated (0 already connected chunk groups reconnected) + 2 queue items processed (1 blocks) + 0 chunk groups connected + 0 chunk groups processed for merging (0 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) + 0 chunk group info updated (0 already connected chunk groups reconnected) + 5 hidden lines " `; @@ -2148,11 +2157,20 @@ LOG from LogTestPlugin End + 6 hidden lines +LOG from webpack.FlagDependencyExportsPlugin + 100% of exports of modules have been determined (6 not cached, 0 flagged uncacheable, 0 from cache, 0 additional calculations due to dependencies) ++ 3 hidden lines + +LOG from webpack.Compilation + 6 modules hashed (1 variants per module in average) + 100% code generated (6 generated, 0 from cache) ++ 19 hidden lines + LOG from webpack.buildChunkGraph - Statistics: 15 queue items processed (9 blocks) - Statistics: 3 chunk groups connected - Statistics: 3 chunk groups processed for merging (3 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) - Statistics: 3 chunk group info updated (0 already connected chunk groups reconnected) + 15 queue items processed (9 blocks) + 3 chunk groups connected + 3 chunk groups processed for merging (3 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) + 3 chunk group info updated (0 already connected chunk groups reconnected) + 13 hidden lines " `; @@ -2409,6 +2427,7 @@ LOG from webpack.Compiler LOG from webpack.FlagDependencyExportsPlugin restore cached provided exports: X ms figure out provided exports: X ms + 100% of exports of modules have been determined (6 not cached, 0 flagged uncacheable, 0 from cache, 0 additional calculations due to dependencies) store provided exports into cache: X ms LOG from webpack.InnerGraphPlugin @@ -2420,7 +2439,9 @@ LOG from webpack.Compilation optimize dependencies: X ms create chunks: X ms optimize: X ms + 6 modules hashed (1 variants per module in average) module hashing: X ms + 100% code generated (6 generated, 0 from cache) code generation: X ms runtime requirements: X ms hashing: initialize hash: X ms @@ -2453,10 +2474,10 @@ LOG from webpack.buildChunkGraph visitModules: merging available modules: X ms visitModules: check modules for revisit: X ms visitModules: visiting: X ms - Statistics: 15 queue items processed (9 blocks) - Statistics: 3 chunk groups connected - Statistics: 3 chunk groups processed for merging (3 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) - Statistics: 3 chunk group info updated (0 already connected chunk groups reconnected) + 15 queue items processed (9 blocks) + 3 chunk groups connected + 3 chunk groups processed for merging (3 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) + 3 chunk group info updated (0 already connected chunk groups reconnected) visitModules: X ms connectChunkGroups: X ms cleanup: X ms