Skip to content

Remove ineffective turbo-tasks#91341

Merged
lukesandberg merged 4 commits into
canaryfrom
more_ineffective_tasks
May 8, 2026
Merged

Remove ineffective turbo-tasks#91341
lukesandberg merged 4 commits into
canaryfrom
more_ineffective_tasks

Conversation

@lukesandberg
Copy link
Copy Markdown
Contributor

@lukesandberg lukesandberg commented Mar 13, 2026

Remove ineffective turbo-tasks

Identifies and removes turbo-tasks functions where the task overhead exceeds the value they provide. Each turbo-task carries ~4-6μs execution overhead per miss and ~200-500ns per cache hit, plus allocations and bookkeeping.

What?

Removes 22 #[turbo_tasks::function] implementations across resolve plugins, chunk items, and resolve-result helpers — converting them to plain methods or inlining their work. Changes fall into a few buckets:

  • ResolvePlugin condition handling (AfterResolvePluginCondition::matches, BeforeResolvePluginCondition::matches, after_resolve_condition, before_resolve_condition): conditions now store the resolved Glob as a ReadRef<Glob> on the plugin struct at construction, so matches is a pure sync function and the per-plugin *_resolve_condition getters are trivial field reads (no longer turbo-tasks). The after_resolve / before_resolve hooks themselves stay as #[turbo_tasks::function] — they synthesize virtual sources/modules and need memoization on (self, lookup_path, reference_type, request) to avoid distinct cells producing duplicate module-graph idents.
    • The basic theory here is that the right level of caching is at resolve and at the hook bodies themselves, not the conditions or condition getters.
    • AfterResolvePluginCondition and BeforeResolvePluginCondition are marked serialization = "none" because ReadRef cannot be persisted; plugin construction is cheap enough to re-derive on restore.
  • ChunkItem trait methods (chunking_context, ty, content_with_async_module_info): returned constants or simple field reads, zero cache hits and no .await calls (no invalidation value).
  • ResolveResult / ModuleResolveResult helpers (primary_modules, first_module, first_source, primary_sources, is_unresolvable, primary_output_assets): simple iterators over already-resolved data; converted to plain methods. Added a Duplicate(usize) variant to ModuleResolveResultItem to handle dedup at construction time instead of in a separate task.
    • The basic idea here is that it is reasonable to consume ResolveResult/ModuleResolveResult monolithically, and we get little to no benefit from fine grained access. e.g. is_unresolved() in theory that is a valuable turbotask, but since it rarely changes but generally if we change how we resolve an import then we have to regenerate code, so saving a few boolean conditions is unlikely to be very valuable.
  • Misc: EcmascriptModuleAsset::analyze, is_types_resolving_enabled, next_server::resolve::condition.

Impact (vercel-site build, dev first-compile)

Metric Before After Δ
Total cache hits 30,885,827 29,201,314 −1,684,513
Total cache misses 6,473,123 5,953,626 −519,497
Overall hit rate 82.67% 83.06% +0.39 pp
Registered task functions 1,294 1,272 −22

The 22 removed tasks were collectively responsible for ~519K misses per build — each miss previously paying the full execution overhead. Most of the work from EcmascriptModuleAsset::analyze naturally migrated into analyze_ecmascript_module (the task it was wrapping; +129K hits there).

On-disk cache size (persistent caching)

Each removed task also stops allocating cache cells on disk. Measured on the same vercel-site build with .next/cache/turbopack (persistent cache enabled):

Size
canary 2.56 GiB
this branch 2.46 GiB
saved ~100 MiB (−3.81%)

Build-time wall clock and peak memory

Ran pnpm next build --experimental-build-mode=compile 5 times on each branch

Peak RSS — clear reduction:

canary branch Δ
min 19.18 GiB 18.94 GiB
median 19.22 GiB 19.01 GiB −217 MiB (−1.10%)
mean 19.21 GiB 19.02 GiB −199 MiB (−1.01%)
max 19.23 GiB 19.13 GiB

Every branch run has lower RSS than every canary run — the distributions don't overlap. Welch's t = −6.03.

Wall time — no measurable change:

canary branch Δ
min 62.03s 60.78s
median 62.61s 62.65s +0.04s (+0.06%)
mean 62.83s 63.80s +0.96s (+1.53%)
max 64.25s 68.23s
stddev 0.84s 3.42s

Median is flat. The mean difference is within noise (Welch's t = +0.61, n = 5). Branch run-to-run variance is higher — one 68.23s outlier pulls the mean up — so this is neither a regression nor a measurable speedup at this sample size.

@nextjs-bot nextjs-bot added created-by: Turbopack team PRs by the Turbopack team. Turbopack Related to Turbopack with Next.js. labels Mar 13, 2026
Copy link
Copy Markdown
Contributor Author

lukesandberg commented Mar 13, 2026

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Mar 13, 2026

Merging this PR will not alter performance

✅ 17 untouched benchmarks
⏩ 3 skipped benchmarks1


Comparing more_ineffective_tasks (905545d) with canary (c526347)

Open in CodSpeed

Footnotes

  1. 3 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.

@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Mar 13, 2026

Failing test suites

Commit: 94d2f96 | About building and testing Next.js

pnpm test test/integration/rewrites-manual-href-as/test/index.test.ts (turbopack) (job)

  • rewrites manual href/as > development mode > should allow manual href/as on index page (DD)
  • rewrites manual href/as > production mode > should allow manual href/as on index page (DD)
Expand output

● rewrites manual href/as › development mode › should allow manual href/as on index page

expect(received).toBeTruthy()

Received: false

  28 |
  29 |     expect(await browser.elementByCss('#index').text()).toBe('index page')
> 30 |     expect(await browser.hasElementByCssSelector('#modal')).toBeTruthy()
     |                                                             ^
  31 |     expect(await browser.eval('window.beforeNav')).toBe(1)
  32 |     expect(JSON.parse(await browser.elementByCss('#query').text())).toEqual({
  33 |       imageId: '123',

  at Object.toBeTruthy (integration/rewrites-manual-href-as/test/index.test.ts:30:61)

● rewrites manual href/as › production mode › should allow manual href/as on index page

expect(received).toBeTruthy()

Received: false

  28 |
  29 |     expect(await browser.elementByCss('#index').text()).toBe('index page')
> 30 |     expect(await browser.hasElementByCssSelector('#modal')).toBeTruthy()
     |                                                             ^
  31 |     expect(await browser.eval('window.beforeNav')).toBe(1)
  32 |     expect(JSON.parse(await browser.elementByCss('#query').text())).toEqual({
  33 |       imageId: '123',

  at Object.toBeTruthy (integration/rewrites-manual-href-as/test/index.test.ts:30:61)

@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Mar 13, 2026

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 455ms 455ms ▁▁█▁▁
Cold (Ready in log) 436ms 436ms ▁▁█▁▁
Cold (First Request) 1.214s 1.238s ▁▃█▁▃
Warm (Listen) 456ms 457ms ▁▁█▁▁
Warm (Ready in log) 441ms 441ms ▁▁█▁▁
Warm (First Request) 350ms 346ms ▁▁█▁▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 455ms 456ms ▁▁▁▁▁
Cold (Ready in log) 443ms 443ms ▃▃▃▃▃
Cold (First Request) 1.962s 1.959s ▂▂▁▂▂
Warm (Listen) 456ms 455ms ▁▁▁▁▁
Warm (Ready in log) 444ms 443ms ▃▃▃▃▃
Warm (First Request) 1.963s 1.974s ▂▂▁▂▂

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 3.938s 3.862s ▂▁█▂▁
Cached Build 3.917s 3.864s ▂▁█▁▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.484s 14.502s ▁▁▁▁▁
Cached Build 14.632s 14.642s ▁▁▁▁▁
node_modules Size 482 MB 482 MB ▁▁▁▁▁
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
0_6xxv2jiaklh.js gzip 13.6 kB N/A -
0.-r71sd1j_zb.js gzip 7.61 kB N/A -
0~lwfcrlb4v_9.css gzip 115 B 115 B
00h0nz7r436~l.js gzip 13.3 kB N/A -
02ku7edzc_wf7.js gzip 450 B N/A -
03~yq9q893hmn.js gzip 39.4 kB 39.4 kB
03kfigr~tki9k.js gzip 153 B N/A -
06fjs~acvcipw.js gzip 155 B N/A -
07sn0b4nbcn1d.js gzip 48 kB N/A -
07yamol04-7he.js gzip 158 B N/A -
082o1b6e4cgsl.js gzip 162 B N/A -
092lcb3fqrrf9.js gzip 8.52 kB N/A -
0aj~xs1l1g8tg.js gzip 8.53 kB N/A -
0dljykshdtp~7.js gzip 154 B N/A -
0e0fjxi5x2ovt.js gzip 152 B N/A -
0gx~e1o3o_.dp.js gzip 156 B N/A -
0h35gmp9u328z.js gzip 8.54 kB N/A -
0h6fkavebp.iz.js gzip 8.47 kB N/A -
0ino_yf1k3h6k.js gzip 10.4 kB N/A -
0k.sixc712dq1.js gzip 10.1 kB N/A -
0kkm7tesfinr6.js gzip 12.9 kB N/A -
0moy~uao4dl.m.js gzip 9.19 kB N/A -
0n1xzocv_dmxu.js gzip 65.7 kB N/A -
0q50rtpusjy90.js gzip 2.28 kB N/A -
0smgy2grrrlka.js gzip 8.58 kB N/A -
0srvny17kd5qf.js gzip 161 B N/A -
0t1dzhdfh0txh.js gzip 215 B 215 B
0x_2nfhowr8pf.js gzip 169 B N/A -
0zid7o0-vupvp.js gzip 225 B N/A -
0znet827k2qvd.js gzip 156 B N/A -
1013-q1.~kmsp.js gzip 156 B N/A -
11yo3xfd6b147.js gzip 12.9 kB N/A -
13.84hqxl_1p7.js gzip 9.76 kB N/A -
1554wr-t7p6z-.js gzip 8.55 kB N/A -
158h_tezj46ng.js gzip 70.8 kB N/A -
15tjst79~qy3_.js gzip 1.46 kB N/A -
15z_v00ne4ud0.js gzip 8.47 kB N/A -
160~3n3z.rtcg.js gzip 156 B N/A -
17d_m3p4j9w6r.js gzip 5.62 kB N/A -
17yu~3yiu7d2m.js gzip 8.52 kB N/A -
189pta_o9070_.js gzip 156 B N/A -
turbopack-0-.._2ck.js gzip 4.16 kB N/A -
turbopack-00..0-ng.js gzip 4.17 kB N/A -
turbopack-04...n1h.js gzip 4.16 kB N/A -
turbopack-05..genk.js gzip 4.16 kB N/A -
turbopack-0a..oj61.js gzip 4.16 kB N/A -
turbopack-0f..1wp4.js gzip 4.15 kB N/A -
turbopack-0f..pko_.js gzip 4.15 kB N/A -
turbopack-0j..9wmf.js gzip 4.16 kB N/A -
turbopack-0q..a_70.js gzip 4.16 kB N/A -
turbopack-0s..5z.w.js gzip 4.16 kB N/A -
turbopack-0x..bgal.js gzip 4.16 kB N/A -
turbopack-0x..dq1_.js gzip 4.16 kB N/A -
turbopack-17..6t3t.js gzip 4.14 kB N/A -
turbopack-17..bgbq.js gzip 4.16 kB N/A -
0_~83b5e6e7l0.js gzip N/A 13.6 kB -
0~8z_sx_iaue1.js gzip N/A 156 B -
00_yiead245-g.js gzip N/A 154 B -
00qxokmb8l1i9.js gzip N/A 155 B -
01-jagslnpmfq.js gzip N/A 156 B -
02s0ipraqc1x4.js gzip N/A 65.7 kB -
03t__~.5lvgeu.js gzip N/A 5.62 kB -
04d6ll75jqx3r.js gzip N/A 9.19 kB -
0583exyh-yhc7.js gzip N/A 9.76 kB -
05b07nana~4_..js gzip N/A 10.1 kB -
072lv63r8dcz~.js gzip N/A 8.58 kB -
07ywrka~ab742.js gzip N/A 156 B -
0ar1~bwpezfgw.js gzip N/A 13.3 kB -
0bhrcv3zhgglb.js gzip N/A 160 B -
0c99mq1ez2bke.js gzip N/A 450 B -
0cq-cmde_ws6u.js gzip N/A 8.47 kB -
0fwf102w10o9~.js gzip N/A 8.52 kB -
0gtmn.q_j1v5r.js gzip N/A 10.4 kB -
0jhtb~3297y0u.js gzip N/A 48 kB -
0l4d~z7ixj3wz.js gzip N/A 12.9 kB -
0nclq9z6yzzm5.js gzip N/A 1.46 kB -
0nzumcogektg7.js gzip N/A 8.55 kB -
0p_~2lgjn3rkr.js gzip N/A 152 B -
0s.c-cn5eebrx.js gzip N/A 8.47 kB -
0tna7lg6q4zne.js gzip N/A 12.9 kB -
0tzsv~9ki.9x-.js gzip N/A 155 B -
0votdfxr5fb5u.js gzip N/A 2.28 kB -
0w_00kd57iuc2.js gzip N/A 169 B -
0xdtms9j1~acv.js gzip N/A 70.8 kB -
0xkuhv202qqhu.js gzip N/A 7.6 kB -
0ykl9bs_qj.5..js gzip N/A 8.52 kB -
0zfen0tnxp4gh.js gzip N/A 8.55 kB -
10wkq1h9jzkg..js gzip N/A 225 B -
12_65ixdzlrxl.js gzip N/A 162 B -
125qkkx49dylx.js gzip N/A 157 B -
149ndfh8zfcaz.js gzip N/A 8.53 kB -
16v~mw514qk0b.js gzip N/A 156 B -
18dr1phwfsppg.js gzip N/A 156 B -
turbopack-0~..1_ap.js gzip N/A 4.16 kB -
turbopack-0~..xb1m.js gzip N/A 4.14 kB -
turbopack-01..c5.4.js gzip N/A 4.16 kB -
turbopack-0a..c58v.js gzip N/A 4.16 kB -
turbopack-0h..7yh4.js gzip N/A 4.16 kB -
turbopack-0j..hys9.js gzip N/A 4.16 kB -
turbopack-0m.._2sh.js gzip N/A 4.16 kB -
turbopack-0o..-33n.js gzip N/A 4.16 kB -
turbopack-0q..dg5m.js gzip N/A 4.18 kB -
turbopack-0r..2bnq.js gzip N/A 4.16 kB -
turbopack-0s..s1ev.js gzip N/A 4.16 kB -
turbopack-0w..x33d.js gzip N/A 4.16 kB -
turbopack-0x..bdqz.js gzip N/A 4.16 kB -
turbopack-0y..eyz3.js gzip N/A 4.16 kB -
Total 462 kB 462 kB ⚠️ +25 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 714 B 708 B
Total 714 B 708 B ✅ -6 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 431 B 430 B
Total 431 B 430 B ✅ -1 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.54 kB N/A -
6280-HASH.js gzip 59.9 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.59 kB N/A -
e8aec2e4-HASH.js gzip 62.7 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 254 B 254 B
main-HASH.js gzip 39.2 kB 39.2 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.59 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.55 kB -
6948ada0-HASH.js gzip N/A 62.7 kB -
9544-HASH.js gzip N/A 60.6 kB -
Total 234 kB 235 kB ⚠️ +723 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.51 kB 2.51 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.98 kB 7.98 kB ✅ -1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 125 kB 125 kB
page.js gzip 267 kB 267 kB
Total 392 kB 392 kB ✅ -256 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 615 B 617 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 43.8 kB 44.1 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.4 kB 45.7 kB ⚠️ +254 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 715 B 718 B
Total 715 B 718 B ⚠️ +3 B
Build Cache
Canary PR Change
0.pack gzip 4.23 MB 4.23 MB 🟢 5.08 kB (0%)
index.pack gzip 108 kB 108 kB
index.pack.old gzip 108 kB 108 kB
Total 4.45 MB 4.45 MB ✅ -5.08 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 332 kB 332 kB
app-page-exp..prod.js gzip 180 kB 180 kB
app-page-tur...dev.js gzip 332 kB 332 kB
app-page-tur..prod.js gzip 180 kB 180 kB
app-page-tur...dev.js gzip 328 kB 328 kB
app-page-tur..prod.js gzip 178 kB 178 kB
app-page.run...dev.js gzip 329 kB 329 kB
app-page.run..prod.js gzip 178 kB 178 kB
app-route-ex...dev.js gzip 76 kB 76 kB
app-route-ex..prod.js gzip 51.7 kB 51.7 kB
app-route-tu...dev.js gzip 76 kB 76 kB
app-route-tu..prod.js gzip 51.7 kB 51.7 kB
app-route-tu...dev.js gzip 75.6 kB 75.6 kB
app-route-tu..prod.js gzip 51.5 kB 51.5 kB
app-route.ru...dev.js gzip 75.5 kB 75.5 kB
app-route.ru..prod.js gzip 51.4 kB 51.4 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43.3 kB 43.3 kB
pages-api-tu..prod.js gzip 33 kB 33 kB
pages-api.ru...dev.js gzip 43.3 kB 43.3 kB
pages-api.ru..prod.js gzip 33 kB 33 kB
pages-turbo....dev.js gzip 52.7 kB 52.7 kB
pages-turbo...prod.js gzip 38.6 kB 38.6 kB
pages.runtim...dev.js gzip 52.7 kB 52.7 kB
pages.runtim..prod.js gzip 38.6 kB 38.6 kB
server.runti..prod.js gzip 62.4 kB 62.4 kB
Total 2.95 MB 2.95 MB ⚠️ +4 B
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/69f42c838a6a988995be5dd658a8be54034f271e/next

Comment thread crates/next-api/src/app.rs Outdated
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 49d503b to 69f42c8 Compare March 13, 2026 23:33
@lukesandberg lukesandberg changed the title remove some more Remove ineffective turbo-tasks Mar 13, 2026
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 69f42c8 to 94d2f96 Compare April 3, 2026 15:40
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 94d2f96 to d9d04d5 Compare April 20, 2026 00:05
@lukesandberg lukesandberg changed the base branch from canary to graphite-base/91341 April 20, 2026 20:03
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from d9d04d5 to 2fbcd36 Compare April 20, 2026 20:03
@lukesandberg lukesandberg changed the base branch from graphite-base/91341 to 04-20-adopt_catalogs April 20, 2026 20:03
@lukesandberg lukesandberg force-pushed the 04-20-adopt_catalogs branch from 06d6fc4 to 8e2af10 Compare April 20, 2026 20:22
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 2fbcd36 to 0ffa417 Compare April 20, 2026 20:22
@lukesandberg lukesandberg marked this pull request as ready for review April 20, 2026 23:48
@lukesandberg lukesandberg requested a review from a team April 20, 2026 23:48
@lukesandberg lukesandberg changed the base branch from 04-20-adopt_catalogs to graphite-base/91341 April 21, 2026 18:19
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 4873b41 to 80f135b Compare April 21, 2026 18:54
@graphite-app graphite-app Bot changed the base branch from graphite-base/91341 to canary April 21, 2026 18:54
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 80f135b to 905545d Compare April 21, 2026 18:54
@lukesandberg lukesandberg marked this pull request as draft April 21, 2026 19:30
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch 2 times, most recently from e550aff to 7a01a73 Compare April 25, 2026 01:21
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 25, 2026

Stats from current PR

🟢 1 improvement

Metric Canary PR Change Trend
node_modules Size 505 MB 505 MB 🟢 275 kB (0%) ▁▁▁██
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 811ms 811ms ▁▅▅▃▅
Cold (Ready in log) 778ms 776ms ▆█▂▁▄
Cold (First Request) 1.204s 1.206s ▄▆▂▂▅
Warm (Listen) 812ms 812ms ▁▆▆▃▃
Warm (Ready in log) 780ms 778ms ▆█▂▂▄
Warm (First Request) 587ms 582ms ▇█▂▃▅
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 811ms 810ms █████
Cold (Ready in log) 773ms 772ms ▇▇███
Cold (First Request) 3.109s 3.108s ▇▅▄██
Warm (Listen) 812ms 811ms █████
Warm (Ready in log) 773ms 774ms ▇▆▇██
Warm (First Request) 3.119s 3.085s ▅▃▃▇█

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.722s 4.732s █▆▁▁▆
Cached Build 4.759s 4.751s ▆▅▁▄▅
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 23.423s 23.407s ▅▆▅██
Cached Build 23.462s 23.410s ▄▄▆▆█
node_modules Size 505 MB 505 MB 🟢 275 kB (0%) ▁▁▁██
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
0-_gc56kf9tfo.js gzip 154 B N/A -
047ad-p-61fjn.js gzip 156 B N/A -
04hm05ar7kldw.js gzip 5.73 kB N/A -
0714gv_gbisrs.js gzip 70.8 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0dvitrl5zg37g.js gzip 8.82 kB N/A -
0sf7ysou-72zd.js gzip 8.71 kB N/A -
11ny9t-iyn9yw.js gzip 154 B N/A -
157abun3hwc_s.js gzip 10.3 kB N/A -
1bhal_i5byhy7.js gzip 162 B N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1jfwzy3ri2pyr.js gzip 154 B N/A -
1jj68jv9537mc.js gzip 13.8 kB N/A -
1jpaub6y8xlfr.js gzip 2.3 kB N/A -
1ot0mvscrc_uf.js gzip 233 B N/A -
2_m3xv2uq3sjc.js gzip 1.46 kB N/A -
224i1-g0lqvss.js gzip 49.5 kB N/A -
24y34mwgrkqp4.js gzip 8.78 kB N/A -
28lrkt28g7fpx.js gzip 155 B N/A -
2c-fd4y1zozz8.js gzip 8.79 kB N/A -
2d7416h_xd36x.js gzip 8.71 kB N/A -
2extn3odmmem_.js gzip 12.9 kB N/A -
2fyhyy7niw9r6.js gzip 7.61 kB N/A -
2lyuhit6rn8fy.js gzip 9.44 kB N/A -
2q0gr8wfr3jwl.js gzip 8.77 kB N/A -
2qmtk0zius6fd.js gzip 157 B N/A -
2t9e75oz6r0zp.js gzip 8.76 kB N/A -
2uku_olcn15b7.js gzip 8.79 kB N/A -
30r8mm-46bdqy.js gzip 220 B 220 B
3c03ks8ic59bl.js gzip 160 B N/A -
3c03yiy5ds-h6.js gzip 65.5 kB N/A -
3d0blqiuhma_c.js gzip 155 B N/A -
3inab2jybr4k9.js gzip 450 B N/A -
3jkm5tdjvaf_q.js gzip 13.1 kB N/A -
3mix8ikliw_bj.js gzip 169 B N/A -
3mt67agm5wp40.js gzip 10.6 kB N/A -
3saabek4kohwi.js gzip 10 kB N/A -
3x_ftwxjtc4jr.js gzip 152 B N/A -
3x0-g47j0wg_t.js gzip 154 B N/A -
40pcd44z40i4a.js gzip 156 B N/A -
4189xmby9yu1p.js gzip 13.6 kB N/A -
turbopack-02..93y4.js gzip 4.2 kB N/A -
turbopack-0m..eii3.js gzip 4.2 kB N/A -
turbopack-0t..cm46.js gzip 4.2 kB N/A -
turbopack-13..1jkn.js gzip 4.2 kB N/A -
turbopack-1m..-lpg.js gzip 4.18 kB N/A -
turbopack-1s..s1zo.js gzip 4.21 kB N/A -
turbopack-23..--2_.js gzip 4.2 kB N/A -
turbopack-28..zluk.js gzip 4.2 kB N/A -
turbopack-2a..kxyc.js gzip 4.2 kB N/A -
turbopack-2s..sur4.js gzip 4.2 kB N/A -
turbopack-2z..x5dq.js gzip 4.19 kB N/A -
turbopack-3h..65h_.js gzip 4.2 kB N/A -
turbopack-3s..rdjl.js gzip 4.2 kB N/A -
turbopack-3y..gfl4.js gzip 4.2 kB N/A -
03_5w3jfg2kc-.js gzip N/A 10.1 kB -
05e40c15cx1dd.js gzip N/A 7.61 kB -
05pe8rzbupg6u.js gzip N/A 10.4 kB -
05v6t_jh5f_yx.js gzip N/A 13.8 kB -
0806zgk7siyp7.js gzip N/A 8.6 kB -
08dxtljl67uwg.js gzip N/A 156 B -
0fod6nyyd77zu.js gzip N/A 49.5 kB -
0htsbiobnao9x.js gzip N/A 13.4 kB -
0m34gln_kt4fg.js gzip N/A 5.73 kB -
0rs6tf8z8po60.js gzip N/A 8.52 kB -
16f2cu5irq6cm.js gzip N/A 160 B -
1an3yhxaoku_n.js gzip N/A 155 B -
1av1jag822n6l.js gzip N/A 8.51 kB -
1er7dqnoopydf.js gzip N/A 8.59 kB -
1g3q1ww01thnl.js gzip N/A 2.3 kB -
1i0eqvqjhhe_v.js gzip N/A 8.57 kB -
1i2188wh2oorx.js gzip N/A 157 B -
1l9un1sl77287.js gzip N/A 1.46 kB -
1plr452d5ya0m.js gzip N/A 155 B -
1q98wrj3--vyg.js gzip N/A 155 B -
1rpz5kbg-qi7x.js gzip N/A 170 B -
1z4y3zbj8nguh.js gzip N/A 70.8 kB -
2147zgtf14z-q.js gzip N/A 234 B -
23ro2xkthrr36.js gzip N/A 156 B -
25z5pyx03noy-.js gzip N/A 8.57 kB -
2lf717n7y9xvn.js gzip N/A 9.82 kB -
2st_qs6p_9us0.js gzip N/A 13.1 kB -
3214a3_0hs02x.js gzip N/A 8.6 kB -
353cu5e7jhyu_.js gzip N/A 157 B -
35805fay7jtzc.js gzip N/A 65.6 kB -
38l-2n-xv_j.js gzip N/A 9.24 kB -
3ei-smgdrgxyw.js gzip N/A 156 B -
3hqti_t-zy1x4.js gzip N/A 449 B -
3nser88va0i70.js gzip N/A 161 B -
3pvkpa748u31-.js gzip N/A 157 B -
3qov6fn4ke7dt.js gzip N/A 152 B -
3z3a37i3a_vgl.js gzip N/A 8.63 kB -
41mf-x3mmsxae.js gzip N/A 12.9 kB -
turbopack-0q..w8sw.js gzip N/A 4.2 kB -
turbopack-0y..gef9.js gzip N/A 4.2 kB -
turbopack-1o..u_k4.js gzip N/A 4.2 kB -
turbopack-1q..hm8b.js gzip N/A 4.2 kB -
turbopack-26..wic1.js gzip N/A 4.2 kB -
turbopack-28..z8dg.js gzip N/A 4.21 kB -
turbopack-2b..pe_l.js gzip N/A 4.2 kB -
turbopack-2e..2st1.js gzip N/A 4.2 kB -
turbopack-2j..3920.js gzip N/A 4.2 kB -
turbopack-2j..l1ht.js gzip N/A 4.18 kB -
turbopack-2l..1iot.js gzip N/A 4.2 kB -
turbopack-35..p-rf.js gzip N/A 4.2 kB -
turbopack-3w..wbem.js gzip N/A 4.2 kB -
turbopack-3x..igwd.js gzip N/A 4.2 kB -
Total 468 kB 466 kB ✅ -2.48 kB

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 716 B 718 B
Total 716 B 718 B ⚠️ +2 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 429 B 434 B 🔴 +5 B (+1%)
Total 429 B 434 B ⚠️ +5 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2258-HASH.js gzip 61.1 kB N/A -
2266-HASH.js gzip 4.69 kB N/A -
3317.HASH.js gzip 169 B N/A -
4866-HASH.js gzip 5.64 kB N/A -
9e302639-HASH.js gzip 62.7 kB N/A -
framework-HASH.js gzip 59.5 kB 59.5 kB
main-app-HASH.js gzip 255 B 254 B
main-HASH.js gzip 39.9 kB 39.7 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
175fd0fd-HASH.js gzip N/A 62.7 kB -
2596-HASH.js gzip N/A 5.63 kB -
34-HASH.js gzip N/A 61 kB -
5691.HASH.js gzip N/A 169 B -
9156-HASH.js gzip N/A 4.68 kB -
Total 236 kB 235 kB ✅ -295 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 181 B 182 B
css-HASH.js gzip 334 B 332 B
dynamic-HASH.js gzip 1.79 kB 1.81 kB
edge-ssr-HASH.js gzip 255 B 255 B
head-HASH.js gzip 351 B 348 B
hooks-HASH.js gzip 385 B 384 B
image-HASH.js gzip 580 B 580 B
index-HASH.js gzip 257 B 259 B
link-HASH.js gzip 2.51 kB 2.52 kB
routerDirect..HASH.js gzip 318 B 319 B
script-HASH.js gzip 387 B 386 B
withRouter-HASH.js gzip 316 B 316 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.99 kB ⚠️ +19 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 275 kB 269 kB 🟢 5.59 kB (-2%)
Total 401 kB 396 kB ✅ -5.58 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 616 B 616 B
middleware-r..fest.js gzip 155 B 155 B
middleware.js gzip 44.9 kB 44.8 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 46.5 kB 46.4 kB ✅ -97 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 719 B 717 B
Total 719 B 717 B ✅ -2 B
Build Cache
Canary PR Change
0.pack gzip 4.45 MB 4.43 MB 🟢 20.7 kB (0%)
index.pack gzip 115 kB 114 kB 🟢 1.33 kB (-1%)
index.pack.old gzip 112 kB 114 kB
Total 4.68 MB 4.66 MB ✅ -20.9 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 349 kB 349 kB
app-page-exp..prod.js gzip 194 kB 194 kB
app-page-tur...dev.js gzip 349 kB 349 kB
app-page-tur..prod.js gzip 194 kB 194 kB
app-page-tur...dev.js gzip 345 kB 345 kB
app-page-tur..prod.js gzip 192 kB 192 kB
app-page.run...dev.js gzip 346 kB 346 kB
app-page.run..prod.js gzip 192 kB 192 kB
app-route-ex...dev.js gzip 77.5 kB 77.4 kB
app-route-ex..prod.js gzip 52.9 kB 52.8 kB
app-route-tu...dev.js gzip 77.6 kB 77.4 kB
app-route-tu..prod.js gzip 52.9 kB 52.8 kB
app-route-tu...dev.js gzip 77.2 kB 77 kB
app-route-tu..prod.js gzip 52.7 kB 52.6 kB
app-route.ru...dev.js gzip 77.1 kB 77 kB
app-route.ru..prod.js gzip 52.7 kB 52.6 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 44.3 kB 44.3 kB
pages-api-tu..prod.js gzip 33.8 kB 33.7 kB
pages-api.ru...dev.js gzip 44.3 kB 44.3 kB
pages-api.ru..prod.js gzip 33.7 kB 33.7 kB
pages-turbo....dev.js gzip 53.7 kB 53.7 kB
pages-turbo...prod.js gzip 39.4 kB 39.4 kB
pages.runtim...dev.js gzip 53.6 kB 53.7 kB
pages.runtim..prod.js gzip 39.3 kB 39.4 kB
server.runti..prod.js gzip 63.2 kB 63.2 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
Total 3.36 MB 3.36 MB ✅ -1.42 kB
📝 Changed Files (25 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
  • app-route-ex..ntime.dev.js
  • app-route-ex..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route.runtime.dev.js
  • app-route.ru..time.prod.js
  • pages-api-tu..ntime.dev.js
  • pages-api-tu..time.prod.js
  • pages-api.runtime.dev.js
  • pages-api.ru..time.prod.js
  • ... and 5 more
View diffs
app-page-exp..ntime.dev.js
failed to diff
app-page-exp..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page.runtime.dev.js
failed to diff
app-page.runtime.prod.js
failed to diff
app-route-ex..ntime.dev.js

Diff too large to display

app-route-ex..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route.runtime.dev.js

Diff too large to display

app-route.ru..time.prod.js

Diff too large to display

pages-api-tu..ntime.dev.js

Diff too large to display

pages-api-tu..time.prod.js

Diff too large to display

pages-api.runtime.dev.js

Diff too large to display

pages-api.ru..time.prod.js

Diff too large to display

pages-turbo...ntime.dev.js

Diff too large to display

pages-turbo...time.prod.js

Diff too large to display

pages.runtime.dev.js

Diff too large to display

pages.runtime.prod.js

Diff too large to display

server.runtime.prod.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/af3c3e24cc61fd1cc03e6c8487e3dc3d4c68cb6b/next

Commit: af3c3e2

@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 7a01a73 to 157d145 Compare April 25, 2026 19:00
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 157d145 to f579205 Compare April 25, 2026 19:01
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 25, 2026

Tests Passed

Commit: af3c3e2

@lukesandberg lukesandberg marked this pull request as ready for review April 26, 2026 18:17
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from 19ba862 to b45210d Compare April 26, 2026 18:17
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from b45210d to d83d8b4 Compare May 6, 2026 21:45
@lukesandberg lukesandberg force-pushed the more_ineffective_tasks branch from d83d8b4 to 1c21955 Compare May 7, 2026 02:27
Copy link
Copy Markdown
Member

@bgw bgw left a comment

Choose a reason for hiding this comment

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

Accepting with comments

Comment thread turbopack/crates/turbopack-core/src/chunk/chunk_group.rs Outdated
Comment thread turbopack/crates/turbopack-core/src/resolve/mod.rs
Comment thread turbopack/crates/turbopack-core/src/resolve/mod.rs
Comment thread turbopack/crates/turbopack-core/src/resolve/plugin.rs Outdated
Comment thread turbopack/crates/turbopack-core/src/resolve/plugin.rs
Copy link
Copy Markdown
Contributor Author

lukesandberg commented May 8, 2026

Merge activity

  • May 8, 9:21 PM UTC: A user started a stack merge that includes this pull request via Graphite.
  • May 8, 9:21 PM UTC: @lukesandberg merged this pull request with Graphite.

@lukesandberg lukesandberg merged commit f0c1ffc into canary May 8, 2026
185 checks passed
@lukesandberg lukesandberg deleted the more_ineffective_tasks branch May 8, 2026 21:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Turbopack team PRs by the Turbopack team. Turbopack Related to Turbopack with Next.js.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants