-
Notifications
You must be signed in to change notification settings - Fork 27.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
perf(turbo-tasks): Filter out and do not cache unused arguments #75261
Conversation
Tests Passed |
a7429b6
to
40fd0db
Compare
4dcf00f
to
f22bdcd
Compare
Stats from current PRDefault Build (Increase detected
|
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
buildDuration | 19.2s | 16.6s | N/A |
buildDurationCached | 15.7s | 13s | N/A |
nodeModulesSize | 392 MB | 392 MB | ✓ |
nextStartRea..uration (ms) | 442ms | 441ms | N/A |
Client Bundles (main, webpack)
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
5306-HASH.js gzip | 54 kB | 53.9 kB | N/A |
8276.HASH.js gzip | 169 B | 168 B | N/A |
8377-HASH.js gzip | 5.46 kB | 5.46 kB | N/A |
bccd1874-HASH.js gzip | 52.9 kB | 52.9 kB | ✓ |
framework-HASH.js gzip | 57.5 kB | 57.5 kB | N/A |
main-app-HASH.js gzip | 241 B | 242 B | N/A |
main-HASH.js gzip | 34.5 kB | 34.4 kB | N/A |
webpack-HASH.js gzip | 1.71 kB | 1.71 kB | N/A |
Overall change | 52.9 kB | 52.9 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
_app-HASH.js gzip | 193 B | 193 B | ✓ |
_error-HASH.js gzip | 193 B | 193 B | ✓ |
amp-HASH.js gzip | 512 B | 510 B | N/A |
css-HASH.js gzip | 343 B | 342 B | N/A |
dynamic-HASH.js gzip | 1.84 kB | 1.84 kB | ✓ |
edge-ssr-HASH.js gzip | 265 B | 265 B | ✓ |
head-HASH.js gzip | 363 B | 362 B | N/A |
hooks-HASH.js gzip | 393 B | 392 B | N/A |
image-HASH.js gzip | 4.59 kB | 4.58 kB | N/A |
index-HASH.js gzip | 268 B | 268 B | ✓ |
link-HASH.js gzip | 2.35 kB | 2.35 kB | N/A |
routerDirect..HASH.js gzip | 328 B | 328 B | ✓ |
script-HASH.js gzip | 397 B | 397 B | ✓ |
withRouter-HASH.js gzip | 323 B | 326 B | N/A |
1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
Overall change | 3.59 kB | 3.59 kB | ✓ |
Client Build Manifests
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
_buildManifest.js gzip | 748 B | 747 B | N/A |
Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
index.html gzip | 524 B | 523 B | N/A |
link.html gzip | 539 B | 537 B | N/A |
withRouter.html gzip | 520 B | 520 B | ✓ |
Overall change | 520 B | 520 B | ✓ |
Edge SSR bundle Size
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
edge-ssr.js gzip | 129 kB | 129 kB | N/A |
page.js gzip | 210 kB | 210 kB | N/A |
Overall change | 0 B | 0 B | ✓ |
Middleware size
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
middleware-b..fest.js gzip | 669 B | 665 B | N/A |
middleware-r..fest.js gzip | 155 B | 156 B | N/A |
middleware.js gzip | 31.3 kB | 31.3 kB | N/A |
edge-runtime..pack.js gzip | 844 B | 844 B | ✓ |
Overall change | 844 B | 844 B | ✓ |
Next Runtimes
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
app-page-exp...dev.js gzip | 386 kB | 386 kB | N/A |
app-page-exp..prod.js gzip | 131 kB | 131 kB | ✓ |
app-page-tur..prod.js gzip | 144 kB | 144 kB | ✓ |
app-page-tur..prod.js gzip | 140 kB | 140 kB | ✓ |
app-page.run...dev.js gzip | 373 kB | 373 kB | N/A |
app-page.run..prod.js gzip | 128 kB | 128 kB | ✓ |
app-route-ex...dev.js gzip | 39.4 kB | 39.4 kB | ✓ |
app-route-ex..prod.js gzip | 25 kB | 25 kB | ✓ |
app-route-tu..prod.js gzip | 25 kB | 25 kB | ✓ |
app-route-tu..prod.js gzip | 24.8 kB | 24.8 kB | ✓ |
app-route.ru...dev.js gzip | 41 kB | 41 kB | ✓ |
app-route.ru..prod.js gzip | 24.8 kB | 24.8 kB | ✓ |
dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
pages-api-tu..prod.js gzip | 8.81 kB | 8.81 kB | ✓ |
pages-api.ru...dev.js gzip | 11.5 kB | 11.5 kB | ✓ |
pages-api.ru..prod.js gzip | 8.8 kB | 8.8 kB | ✓ |
pages-turbo...prod.js gzip | 21.6 kB | 21.6 kB | ✓ |
pages.runtim...dev.js gzip | 31.3 kB | 31.3 kB | N/A |
pages.runtim..prod.js gzip | 21.6 kB | 21.6 kB | ✓ |
server.runti..prod.js gzip | 73.7 kB | 73.7 kB | ✓ |
Overall change | 870 kB | 870 kB | ✓ |
build cache Overall increase ⚠️
vercel/next.js canary | vercel/next.js bgw/filter-unused-args | Change | |
---|---|---|---|
0.pack gzip | 2.1 MB | 2.1 MB | |
index.pack gzip | 75.6 kB | 75.6 kB | N/A |
Overall change | 2.1 MB | 2.1 MB |
Diff details
Diff for main-HASH.js
Diff too large to display
Diff for app-page-exp..ntime.dev.js
failed to diff
Diff for app-page.runtime.dev.js
failed to diff
Diff for pages.runtime.dev.js
Diff too large to display
40fd0db
to
2a987b0
Compare
f22bdcd
to
28e47be
Compare
2a987b0
to
dd12daa
Compare
28e47be
to
25ef396
Compare
51a826a
to
35fc3ed
Compare
25ef396
to
c8519e8
Compare
35fc3ed
to
0151e49
Compare
c8519e8
to
5c57296
Compare
0151e49
to
0c17996
Compare
5c57296
to
3e43193
Compare
0c17996
to
7578b8f
Compare
46bad4f
to
f1e477b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some of the turbo-tasks test cases use _key
arguments to make unqiue tasks. Maybe we need to update them to use let _ = arg;
f1e477b
to
100c6a7
Compare
It looks like none of those cases are trait methods, and this PR only impacts trait methods, but I think we should generate a compiler error in the future on non-trait-methods/functions with unused arguments to help ensure some consistency (i.e. that underscored arguments are never used as cache keys). Using underscored arguments on non-trait-methods/functions is likely a mistake, and there are workarounds (wrapper functions, I've fixed the cases I could find in the tests. |
Follow up work: https://linear.app/vercel/issue/PACK-3828/argument-filtering-follow-ups
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A test case would be great
I will do this in a follow up. I'm pretty confident nothing's broken by this, but there's some risk we could silently break this optimization without a unit test. |
This is a follow-up to: #75261 Tracking issue for these follow-ups: https://linear.app/vercel/issue/PACK-3828/argument-filtering-follow-ups
For trait methods, we often have underscore-prefixed arguments that are unused in method implementations, but must exist on the method signature because the trait requires it.
For example, look at
code_generation
: https://github.com/search?q=repo%3Avercel%2Fnext.js%20fn%20code_generation&type=codeWe can filter those arguments as soon as we resolve the real method, and avoid storing them as part of the task's cache key.
This should mean less data stored per task, and better cache hit rates (so less tasks overall).
This appears to give a roughly 5% memory win:
(Spreadsheet: https://docs.google.com/spreadsheets/d/1fz9Q-tDE6LebS9p4Mci8vZG7jkBSajiMYF1WbZEPnts/edit?usp=sharing)
Full data:
Command run:
Before, run 1
Compiled in: 19.3s
Before, run 2
Compiled in: 19.3s
Before, run 3
Compiled in: 18.4s
Before, run 4
Compiled in: 18.2s
Before, run 5
Compiled in: 17.9s
After, run 1
Compiled in: 19.0s
After, run 2
Compiled in: 18.5s
After, run 3
Compiled in: 18.5s
After, run 4
Compiled in: 18.2s
After, run 5
Compiled in: 19.4s
Closes PACK-3833