Skip to content

fix(benchmarks): codspeed improvements#20972

Open
avivkeller wants to merge 12 commits into
mainfrom
codspeed-improvements
Open

fix(benchmarks): codspeed improvements#20972
avivkeller wants to merge 12 commits into
mainfrom
codspeed-improvements

Conversation

@avivkeller
Copy link
Copy Markdown
Member

@avivkeller avivkeller commented May 17, 2026

Replaces our custom benchmark tool with @codspeed/plugin-tinybench

Copilot AI review requested due to automatic review settings May 17, 2026 16:09
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 17, 2026

⚠️ No Changeset found

Latest commit: 936939b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 17, 2026

This PR is packaged and the instant preview is available (936939b).

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@936939b
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@936939b
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@936939b

return {
filter:
typeof raw.filter === "string" && raw.filter
? new RegExp(raw.filter)
Comment thread test/BenchmarkTestCases.benchmark.mjs Fixed
@codecov
Copy link
Copy Markdown

codecov Bot commented May 17, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.91%. Comparing base (41d236c) to head (936939b).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #20972   +/-   ##
=======================================
  Coverage   90.91%   90.91%           
=======================================
  Files         573      573           
  Lines       58639    58639           
  Branches    15774    15774           
=======================================
  Hits        53312    53312           
  Misses       5327     5327           
Flag Coverage Δ
integration 89.60% <ø> (ø)
test262 45.37% <ø> (ø)
unit 36.59% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates webpack’s benchmark harness to integrate CodSpeed’s Tinybench plugin and to support walltime (timing) benchmarks on CodSpeed’s codspeed-macro runners, simplifying the benchmark setup and CI workflow.

Changes:

  • Switch benchmark instrumentation from a custom @codspeed/core integration to @codspeed/tinybench-plugin.
  • Rework BenchmarkTestCases.benchmark.mjs to register walltime-friendly scenarios (cold builds, watch rebuilds, and cache warmups) without baseline/sharding logic.
  • Update the GitHub Actions workflow to run as a single CodSpeed walltime job on codspeed-macro.

Reviewed changes

Copilot reviewed 3 out of 4 changed files in this pull request and generated 2 comments.

File Description
test/BenchmarkTestCases.benchmark.mjs Replaces custom CodSpeed harness with @codspeed/tinybench-plugin, adds scenario-based task registration, removes sharding/baseline logic.
.github/workflows/benchmarks.yml Moves benchmarks to codspeed-macro runner and switches to walltime mode; simplifies job structure.
package.json Updates benchmark script flags and swaps dependency from @codspeed/core to @codspeed/tinybench-plugin.
yarn.lock Adds lock entries for @codspeed/tinybench-plugin and transitive deps (e.g., stack-trace).
Comments suppressed due to low confidence (1)

.github/workflows/benchmarks.yml:44

  • The workflow no longer excludes the *-on-schedule benchmark cases (previously done via NEGATIVE_FILTER: on-schedule). As a result, test/benchmarkCases/typescript-long-on-schedule will run on every PR/push, which likely increases runtime substantially. If these cases are still intended to be schedule-only, restore NEGATIVE_FILTER: on-schedule (or pass --negative-filter on-schedule to yarn benchmark).
      - name: Run benchmarks
        uses: CodSpeedHQ/action@3194d9a39c4d46684cb44bf7207fc56626aad8fd # v4.15.1
        with:
          run: yarn benchmark
          mode: "walltime"


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread test/BenchmarkTestCases.benchmark.mjs
Comment thread test/BenchmarkTestCases.benchmark.mjs
Comment thread test/BenchmarkTestCases.benchmark.mjs Fixed
@avivkeller avivkeller changed the title fix(benchmarks): codspeed improvements {WIP} fix(benchmarks): codspeed improvements May 17, 2026
Comment thread test/BenchmarkTestCases.benchmark.mjs Dismissed
@avivkeller avivkeller changed the title {WIP} fix(benchmarks): codspeed improvements fix(benchmarks): codspeed improvements May 17, 2026
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented May 17, 2026

Merging this PR will create unknown performance changes

🆕 102 new benchmarks
⏩ 216 skipped benchmarks1

Performance Changes

Mode Benchmark BASE HEAD Efficiency
🆕 Memory webpack/context-commonjs/dev-rebuild N/A 190.3 KB N/A
🆕 Memory webpack/lodash/prod-cold N/A 7 MB N/A
🆕 Memory webpack/many-modules-esm/dev-rebuild N/A 243.8 KB N/A
🆕 Memory webpack/devtool-eval-source-map/dev-cold N/A 782.6 KB N/A
🆕 Memory webpack/asset-modules-resource/dev-cold N/A 1.4 MB N/A
🆕 Memory webpack/lodash/dev-cold N/A 2.6 MB N/A
🆕 Memory webpack/typescript-long-on-schedule/prod-cold N/A 36.7 MB N/A
🆕 Memory webpack/devtool-eval-source-map/dev-rebuild N/A 314 KB N/A
🆕 Memory webpack/asset-modules-resource/dev-rebuild N/A 967.1 KB N/A
🆕 Memory webpack/lodash/dev-rebuild N/A 674.1 KB N/A
🆕 Memory webpack/many-modules-esm/dev-cold N/A 832.6 KB N/A
🆕 Memory webpack/context-commonjs/dev-cold N/A 839 KB N/A
🆕 Memory webpack/many-modules-esm/prod-cold N/A 9 MB N/A
🆕 WallTime webpack/context-commonjs/dev-rebuild N/A 82.4 ms N/A
🆕 WallTime webpack/devtool-eval-source-map/dev-cold N/A 245.3 ms N/A
🆕 WallTime webpack/context-commonjs/dev-cold N/A 294.9 ms N/A
🆕 WallTime webpack/devtool-eval-source-map/dev-rebuild N/A 123.4 ms N/A
🆕 WallTime webpack/asset-modules-resource/dev-cold N/A 395.1 ms N/A
🆕 WallTime webpack/many-modules-esm/prod-cold N/A 1.7 s N/A
🆕 WallTime webpack/many-modules-esm/dev-rebuild N/A 75.6 ms N/A
... ... ... ... ... ...

ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.


Comparing codspeed-improvements (936939b) with main (41d236c)

Open in CodSpeed

Footnotes

  1. 216 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@github-actions
Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging codspeed-improvements into main will be
98.95%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.77%100%100%98.77%91
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js91.30%100%100%91.30%140, 142–143, 145, 147, 153–154, 161, 168, 90
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/typescript
   test.filter.js100%100%100%100%
examples/typescript-non-erasable
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%101
   CacheFacade.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%206, 226, 382
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1554, 1850, 1857, 1865, 1887, 2783, 3208, 3870, 3899, 3952–3953, 3957, 3962, 3978–3979, 3993–3994, 3999–4000, 4477, 4503, 493, 498, 5211, 5292, 5307, 5332–5333, 5335, 5659, 5664, 5670, 5673, 5685, 5687, 5691, 5707, 5722, 5754, 5808, 5832, 5946, 712–713
   Compiler.js99.55%100%100%99.55%1116–1117, 1125
   ConcatenationScope.js98.59%100%100%98.59%189
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js100%100%100%100%
   ContextModuleFactory.js97.75%100%100%97.75%258, 393, 418, 443, 447, 458
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js98.92%100%100%98.92%158–159, 175, 194, 268
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.20%100%100%98.20%379, 425
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%237, 378, 391–392
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%49
   ErrorHelpers.js100%100%100%100%
   EvalDevToolModulePlugin.js100%100%100%100%
   EvalSourceMapDevToolPlugin.js100%100%100%100%
   ExportsInfo.js100%100%100%100%
   ExportsInfoApiPlugin.js100%100%100%100%
   ExternalModule.js98.96%100%100%98.96%424–428, 576
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.50%100%100%99.50%182, 2252–2253, 2256, 2267, 2278, 2289, 278, 3694, 3709, 3733
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%399, 401, 405
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LibraryTemplatePlugin.js100%100%100%100%
   LoaderOptionsPlugin.js100%100%100%100%
   LoaderTargetPlugin.js100%100%100%100%
   MainTemplate.js100%100%100%100%
   ManifestPlugin.js100%100%100%100%
   Module.js98.50%100%100%98.50%1305, 1310, 1371, 1385, 1447, 1456
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1004
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%645
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1020, 1036, 1123, 1774, 1779–1789, 708, 711, 728, 745, 986
   NormalModuleFactory.js99.47%100%100%99.47%1075, 1384, 474, 486
   NormalModuleReplacementPlugin.js100%100%100%100%
   NullFactory.js100%100%100%100%
   OptimizationStages.js100%100%100%100%
   OptionsApply.js100%100%100%100%
   Parser.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   PrefetchPlugin.js100%100%100%100%
   ProgressPlugin.js98.85%100%100%98.85%519–520, 525, 527, 591
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   ResolverFactory.js100%100%100%100%
   RuntimeGlobals.js100%100%100%100%
   RuntimeModule.js100%100%100%100%
   RuntimePlugin.js100%100%100%100%
   RuntimeTemplate.js100%100%100%100%
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%267–268, 610
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.86%100%100%98.86%134–135
   UseStrictPlugin.js100%100%100%100%
   WarnCaseSensitiveModulesPlugin.js100%100%100%100%
   WarnDeprecatedOptionPlugin.js100%100%100%100%
   WarnNoModeSetPlugin.js100%100%100%100%
   WatchIgnorePlugin.js100%100%100%100%
   Watching.js100%100%100%100%
   WebpackError.js100%100%100%100%
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%325
   cli.js98.71%100%100%98.71%117, 469, 501, 543, 813
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.22%100%100%97.22%196, 218, 220
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%285, 309, 312, 364, 40
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%71, 83, 91
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%106, 113–114, 122, 89
   PackFileCacheStrategy.js96.40%100%100%96.40%1250, 1350, 1354, 1416, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 722, 728, 762, 768, 774, 779, 790, 799, 804–805, 807, 824, 830–831, 833
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.18%100%100%99.18%1401–1403, 1411, 271, 274, 279, 283, 475
   normalization.js99%100%100%99%191–192, 258, 273
   target.js100%100%100%100%
lib/container
   ContainerEntryDependency.js100%100%100%100%
   ContainerEntryModule.js100%100%100%100%
   ContainerEntryModuleFactory.js100%100%100%100%
   ContainerExposedDependency.js100%100%100%100%
   ContainerPlugin.js100%100%100%100%
   ContainerReferencePlugin.js100%100%100%100%
   FallbackDependency.js100%100%100%100%
   FallbackItemDependency.js100%100%100%100%
   FallbackModule.js100%100%100%100%
   FallbackModuleFactory.js100%100%100%100%
   HoistContainerReferencesPlugin.js100%100%100%100%
   ModuleFederationPlugin.js100%100%100%100%
   RemoteModule.js100%100%100%100%
   

token: ${{ secrets.CODSPEED_TOKEN }}
env:
LAST_COMMIT: 1
NEGATIVE_FILTER: on-schedule
Copy link
Copy Markdown
Member

@alexander-akait alexander-akait May 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please spit them for performance reasons on CI, memory and walltime should be different CI tasks, memory are very unstable if you will mix them

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is that documented? As far as I could tell, it's recommended to run when in a single CI step

Copy link
Copy Markdown
Member

@alexander-akait alexander-akait May 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We asked about unstable memory test using chat at their site, it was recommendation from them

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is the current recommendation, but I can ask

"three-long": PROD_ONLY,
"typescript-long-on-schedule": PROD_ONLY,
"wasm-modules-async": DEV_AND_REBUILD,
"wasm-modules-sync": DEV_AND_REBUILD
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should make all scenarios for all cases, we already in past have problems where we miss performance degradation due missing scenario

Comment thread package.json
"@changesets/cli": "^2.29.8",
"@changesets/get-github-info": "^0.8.0",
"@codspeed/core": "^5.4.0",
"@codspeed/tinybench-plugin": "^5.4.0",
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tinybench-plugin uses old version of tinybench

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it's off by one major version

);
});

bench.run();
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have this script because I have internal CI which check different performance between version, commits and etc, in future I want to share it and make it publicly to see how we faster or slow between versions, not sure we really can remove it, but yes, we can simplify it

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm afraid I don't understand this request. The benchmarking file shouldn't be responsible for evaluating this commit versus that commit for each benchmark, that's what CodSpeed is for

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, we should support it

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why?

Copy link
Copy Markdown
Member

@alexander-akait alexander-akait left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need a discussion about many things here, also I don't think it make our benchmarks stable, I don't see why it should be, code in our benchmark file 1:1 like in the plugin

@alexander-akait
Copy link
Copy Markdown
Member

The main question - why do you think it will have stable benchmarks?

@avivkeller
Copy link
Copy Markdown
Member Author

why do you think it will have stable benchmarks?

I think by using walltime, which measures both CPU time and I/O time, we will be able to see a bigger picture. Plus, by not having additional logic in the benchmark runner, we can discount any issues in that file as causing memory issues

@alexander-akait
Copy link
Copy Markdown
Member

I think by using walltime, which measures both CPU time and I/O time, we will be able to see a bigger picture

We already use it, look at the original code and our code, we have the same just with some internal changes to be more stable and have ability to check something between versions, I really don't see any changes which can make it more stable, if I something missing, please show me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants