Skip to content

Comments

feat(plugin): collect plugin hook execution timings#7364

Merged
shulaoda merged 6 commits intomainfrom
12-04-feat_plugin_collect_plugin_hook_execution_timings
Dec 11, 2025
Merged

feat(plugin): collect plugin hook execution timings#7364
shulaoda merged 6 commits intomainfrom
12-04-feat_plugin_collect_plugin_hook_execution_timings

Conversation

@shulaoda
Copy link
Member

@shulaoda shulaoda commented Dec 7, 2025

When enabled, Rolldown measures time spent in each plugin hook. If plugins significantly impact build performance, a warning is emitted with a breakdown of plugin timings.

Note

For hooks using ctx.resolve() or ctx.load(), the reported time includes waiting for other plugins, which may overestimate that plugin's actual cost.

image

Copy link
Member Author

shulaoda commented Dec 7, 2025


How to use the Graphite Merge Queue

Add the label graphite: merge to this PR to add it to the merge queue.

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@netlify
Copy link

netlify bot commented Dec 7, 2025

Deploy Preview for rolldown-rs ready!

Name Link
🔨 Latest commit 3ab6dc0
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/693a3fd7249c4e0008c42c88
😎 Deploy Preview https://deploy-preview-7364--rolldown-rs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from cc0ee57 to a04c72f Compare December 7, 2025 09:30
@github-actions
Copy link
Contributor

github-actions bot commented Dec 7, 2025

Benchmarks Rust

  • target: main(6cc187d)
  • pr: 12-04-feat_plugin_collect_plugin_hook_execution_timings(3ab6dc0)
group                                                        pr                                     target
-----                                                        --                                     ------
bundle/bundle@multi-duplicated-top-level-symbol              1.00     64.6±2.63ms        ? ?/sec    1.00     64.6±2.74ms        ? ?/sec
bundle/bundle@multi-duplicated-top-level-symbol-sourcemap    1.00     70.6±2.16ms        ? ?/sec    1.02     71.7±2.57ms        ? ?/sec
bundle/bundle@rome_ts                                        1.01    108.7±2.38ms        ? ?/sec    1.00    108.1±2.30ms        ? ?/sec
bundle/bundle@rome_ts-sourcemap                              1.00    121.5±2.65ms        ? ?/sec    1.00    121.0±2.21ms        ? ?/sec
bundle/bundle@threejs                                        1.02     41.0±2.76ms        ? ?/sec    1.00     40.1±1.23ms        ? ?/sec
bundle/bundle@threejs-sourcemap                              1.00     43.8±0.97ms        ? ?/sec    1.00     43.6±0.93ms        ? ?/sec
bundle/bundle@threejs10x                                     1.00    399.4±5.89ms        ? ?/sec    1.00    399.4±7.88ms        ? ?/sec
bundle/bundle@threejs10x-sourcemap                           1.00    460.8±7.47ms        ? ?/sec    1.00    459.8±6.57ms        ? ?/sec
scan/scan@rome_ts                                            1.01     85.2±1.97ms        ? ?/sec    1.00     84.5±1.77ms        ? ?/sec
scan/scan@threejs                                            1.00     28.9±0.59ms        ? ?/sec    1.01     29.2±1.94ms        ? ?/sec
scan/scan@threejs10x                                         1.00    296.9±4.40ms        ? ?/sec    1.00    297.1±4.69ms        ? ?/sec

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch 7 times, most recently from e70443b to 8b22e6e Compare December 9, 2025 06:50
@shulaoda shulaoda marked this pull request as ready for review December 9, 2025 06:51
Copy link
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 adds plugin performance monitoring to Rolldown through a new experimental option warnSlowPlugins. When enabled, the bundler tracks the time spent in each plugin hook during a build and emits a warning if plugins are significantly impacting build performance.

  • Adds timing collection infrastructure using atomic operations for thread-safe accumulation of plugin hook execution times
  • Instruments all plugin hook call sites in the plugin driver to record timing data
  • Implements warning logic that compares plugin time against the link stage (pure Rust) time to detect slow builds
  • Provides TypeScript API and documentation for the new experimental feature

Reviewed changes

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

Show a summary per file
File Description
packages/rolldown/src/utils/bindingify-input-options.ts Adds warnSlowPlugins to experimental options binding
packages/rolldown/src/options/input-options.ts Defines TypeScript API for warnSlowPlugins with comprehensive JSDoc
packages/rolldown/src/binding.d.cts Adds binding type definition for the option
docs/options/experimental.md Documents the feature with usage notes about timing caveats
crates/rolldown_testing/_config.schema.json Updates test config schema
crates/rolldown_plugin/src/types/hook_timing.rs Implements core timing collection with HookTimingCollector
crates/rolldown_plugin/src/plugin_driver/*.rs Instruments all plugin hooks with timing measurements
crates/rolldown_plugin/src/plugin_driver/plugin_driver_factory.rs Conditionally creates timing collector based on option
crates/rolldown_plugin/src/plugin_driver/mod.rs Adds timing helper methods and integrates collector
crates/rolldown_error/src/types/event_kind.rs Adds SlowPlugins event kind
crates/rolldown_error/src/build_diagnostic/events/slow_plugins.rs Implements warning message formatting
crates/rolldown_common/src/inner_bundler_options/types/experimental_options.rs Adds option field and accessor method
crates/rolldown_binding/src/options/binding_input_options/binding_experimental_options.rs Bridges Node.js binding to Rust options
crates/rolldown/src/bundle/bundle.rs Implements warning emission logic with plugin filtering and percentage calculation

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

Copy link
Member

@sapphi-red sapphi-red left a comment

Choose a reason for hiding this comment

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

Have you measured the overhead?

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch 2 times, most recently from be0adab to 0027c6c Compare December 9, 2025 07:16
Copilot AI review requested due to automatic review settings December 9, 2025 07:16
@shulaoda
Copy link
Member Author

shulaoda commented Dec 9, 2025

Have you measured the overhead?

Yes, according to my tests, the performance impact is negligible. I didn’t observe any measurable overhead.

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from 0027c6c to 4abb939 Compare December 9, 2025 07:21
Copy link
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

Copilot reviewed 22 out of 26 changed files in this pull request and generated 3 comments.


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

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from 4abb939 to 545a4b5 Compare December 9, 2025 08:41
@shulaoda shulaoda requested a review from sapphi-red December 9, 2025 08:44
Copy link
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

Copilot reviewed 20 out of 24 changed files in this pull request and generated 2 comments.


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

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from a4efd9a to 4e98380 Compare December 9, 2025 09:08
Copilot AI review requested due to automatic review settings December 10, 2025 07:53
Copy link
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

Copilot reviewed 19 out of 23 changed files in this pull request and generated 1 comment.


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

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from 0a66c91 to d873421 Compare December 10, 2025 08:01
Copy link
Member

@sapphi-red sapphi-red left a comment

Choose a reason for hiding this comment

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

LGTM, but I'd like another member to take a look

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from d873421 to fddda2b Compare December 11, 2025 03:29
@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from fddda2b to 7358d7f Compare December 11, 2025 03:35
@shulaoda shulaoda marked this pull request as ready for review December 11, 2025 03:36
Copilot AI review requested due to automatic review settings December 11, 2025 03:36
@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from b7254ed to 6f95675 Compare December 11, 2025 03:39
Copy link
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

Copilot reviewed 18 out of 22 changed files in this pull request and generated 5 comments.


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

@shulaoda shulaoda force-pushed the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch from 6f95675 to 3ab6dc0 Compare December 11, 2025 03:51
@shulaoda shulaoda merged commit 02cce7f into main Dec 11, 2025
28 checks passed
@shulaoda shulaoda deleted the 12-04-feat_plugin_collect_plugin_hook_execution_timings branch December 11, 2025 04:12
This was referenced Dec 11, 2025
shulaoda added a commit that referenced this pull request Dec 11, 2025
## [1.0.0-beta.54] - 2025-12-11

⏱️ Plugin Timing Analysis
- Added `checks.pluginTimings` option to emit warnings when plugins significantly impact build performance
- More details: https://rolldown.rs/options/checks#plugintimings
<img width="834" height="119" alt="image" src="https://github.com/user-attachments/assets/e819f906-6192-4503-8d5c-854fa92ecb45" />

> [!WARNING]
> For hooks using `ctx.resolve()` or `ctx.load()`, the reported time includes waiting for other plugins, which may overestimate that plugin's actual cost.
>
> Additionally, since plugin hooks execute concurrently, the statistics represent accumulated time rather than wall-clock time. The measured duration also includes Rust-side processing overhead, Tokio async scheduling overhead, NAPI data conversion overhead, and JavaScript event loop overhead.

### 🚀 Features

- rolldown_plugin_vite_reporter: add newline after build summary for better log separation (#7458) by @shulaoda
- plugin: collect plugin hook execution timings (#7364) by @shulaoda
- test-dev-server: reload page when detecting hmr reload message (#7422) by @hyf0
- rolldown_plugin_vite_dynamic_import_vars: add transform-based v2 implementation (#7400) by @shulaoda
- rolldown_plugin_vite_import_glob: add transform-based v2 implementation (#7394) by @shulaoda
- rolldown_plugin_vite_wasm_helper: add v2 implementation (#7402) by @shulaoda
- expose error location and context fields on JS API error objects (#7341) by @Copilot
- add `CIRCULAR_REEXPORT` error (#7337) by @Copilot
- support emit prebuilt chunk (#7277) by @Copilot

### 🐛 Bug Fixes

- preserve object key order when parse json with serde_json (#7443) by @IWANABETHATGUY
- improve JSON parsing with serde_json to emit proper diagnostic (#7442) by @IWANABETHATGUY
- deconflict external symbols in CJS modules (#7447) by @IWANABETHATGUY
- rolldown_plugin_vite_transform,rolldown_plugin_vite_resolve: enable `yarnPnp` option when pnp is detected (#5791) by @sapphi-red
- skip deconflicting top-level symbols for CJS modules (#7425) by @IWANABETHATGUY
- rolldown_plugin_esm_external_require: run resolveId hook before other plugins (#7426) by @shulaoda
- avoid duplicate underscores in legitimized identifiers (#7418) by @IWANABETHATGUY
- use `process.on('exit')` instead of `signal-exit` on webcontainers (#7421) by @sapphi-red
- dev: remove `imports` when an import is removed (#7348) by @sapphi-red
- bench: access latency.mean instead of mean in tinybench result (#7417) by @shulaoda
- path compression in symbol linking (#7392) by @IWANABETHATGUY
- rolldown_plugin_vite_resolve: add RwLock to avoid clearing cache while resolving (#7386) by @sapphi-red
- handle JSON prototype properties correctly (#7383) by @IWANABETHATGUY
- preserve entry signature strict chunk merging (#7343) by @IWANABETHATGUY
- support eliminating multiple unused dynamic imports in a single statement (#7361) by @IWANABETHATGUY
- eliminate unreachable dynamic entry (#7356) by @IWANABETHATGUY
- `NormalizedInputOptions#cwd` should always exists (#7360) by @hyf0
- cli: support multiple comma-separated define arguments (#7340) by @Copilot
- remove redundant symbol param in __reExport runtime helper (#7346) by @IWANABETHATGUY
- always use __export for empty namespace objects when symbols enabled (#7345) by @IWANABETHATGUY
- relax the restriction of preserveEntrySignatures when merging chunks (#7339) by @IWANABETHATGUY

### 🚜 Refactor

- builtin-plugin: make config parameter required for vite plugins (#7451) by @shulaoda
- move esbuild test related scripts to `scripts/src/esbuild-tests` (#7377) by @sapphi-red
- rewrite gen-esbuild-test in TypeScript (#7376) by @sapphi-red
- remove unnecessary Option in current_stmt_idx (#7359) by @IWANABETHATGUY
- move more code into chunk optimizer (#7335) by @IWANABETHATGUY

### 📚 Documentation

- checks: clarify pluginTimings measures CPU time due to concurrent execution (#7448) by @shulaoda
- checks: add accuracy note to pluginTimings documentation (#7441) by @shulaoda
- development-guide: add esbuild test description (#7439) by @sapphi-red
- checks: expand `pluginTimings` documentation with detection mechanism (#7428) by @shulaoda
- add checks options documentation (#7427) by @shulaoda
- development-guide: add test262 integration test description (#7430) by @sapphi-red
- guide: fix grammer in getting-started (#7331) by @jakeparis

### 🧪 Testing

- rollup-tests: make `--grep` work and document it (#7431) by @sapphi-red
- add a way to run some test262 test cases by name (#7429) by @sapphi-red
- rolldown_plugin_vite_dynamic_import_vars: add test cases for v2 implementation (#7401) by @shulaoda
- rolldown_plugin_vite_import_glob: add test cases for v2 implementation (#7395) by @shulaoda
- triage new esbuild tests (#7405) by @sapphi-red
- hmr: delete file used (#5933) by @sapphi-red
- watch: add `watchChange` hook `create` / `delete` tests (#7349) by @sapphi-red
- hmr: delete file not used anymore (#5932) by @sapphi-red
- triage esbuild failed reasons (#7391) by @sapphi-red
- change esbuild tests stats and diff generation (#7379) by @sapphi-red
- dev: add `continuous generate hmr patch` and `debounce bundle` tests (#7368) by @hyf0
- add new esbuild tests (#7353) by @sapphi-red

### ⚙️ Miscellaneous Tasks

- setup Node before updating snapshots for test262 update (#7435) by @sapphi-red
- run tests when submodules are updated (#7455) by @sapphi-red
- exclude NUL path pattern to prevent crash on Windows (#7450) by @IWANABETHATGUY
- run cargo-test for esbuild script changes and update esbuild snapshot (#7440) by @sapphi-red
- jsx_import_meta tests to `ignoreReasons` due to architectural limitation (#7434) by @Copilot
- deps: update dependency oxlint-tsgolint to v0.8.5 (#7433) by @renovate[bot]
- update test dependencies automatically (#7432) by @sapphi-red
- remove unused code (#7420) by @IWANABETHATGUY
- add back `just update-esbuild-diff` and add it to CI (#7404) by @sapphi-red
- deps: update oxc-resolver to 11.15.0 (#7415) by @shulaoda
- deps: update rust crate napi to v3.7.0 (#7393) by @renovate[bot]
- fix esbuild compatibility metrics calculation (#7390) by @sapphi-red
- support `tsconfig: true` in rust tests (#7389) by @sapphi-red
- hide oxc runtime in snapshots (#7388) by @sapphi-red
- deps: update oxc to v0.102.0 (#7385) by @camc314
- improve esbuild tests to download snapshots automatically (#7378) by @sapphi-red
- deps: update dependency tinybench to v6 (#7371) by @renovate[bot]
- deps: update actions/checkout action to v6 (#7370) by @renovate[bot]
- deps: update rust crates (#7367) by @renovate[bot]
- deps: update dependency oxlint to v1.32.0 (#7374) by @renovate[bot]
- deps: update dependency oxlint-tsgolint to v0.8.4 (#7373) by @renovate[bot]
- node/test-dev-server: support using custom html file (#7357) by @hyf0
- test: setup browser-based e2e test for `test-dev-server` (#7351) by @hyf0
- pin pnpm to version 10.23.0 (#7369) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to v0.18.3 (#7372) by @renovate[bot]
- deps: update github-actions (#7365) by @renovate[bot]
- deps: update npm packages (#7366) by @renovate[bot]
- polish the comments about `SymbolRefFlags` (#7358) by @IWANABETHATGUY
- deps: update dependency rolldown-plugin-dts to v0.18.2 (#7355) by @renovate[bot]
- fix esbuild test generation script (#7352) by @sapphi-red
- apply cargo shear suggestion (#7347) by @IWANABETHATGUY
- deps: update oxc to v11.15.0 (#7344) by @renovate[bot]
- deps: update dependency @napi-rs/cli to v3.5.0 (#7338) by @renovate[bot]
- deps: update dependency oxlint to v1.31.0 (#7305) by @renovate[bot]
- update rollup-tests results (#7333) by @sapphi-red
- update rollup-tests Rollup version (#7332) by @sapphi-red
- add ignore config for test262 submodule (#7326) by @Copilot

### ❤️ New Contributors

* @jakeparis made their first contribution in [#7331](#7331)

Co-authored-by: shulaoda <[email protected]>
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.

3 participants