Skip to content

Various memory optimizations - #64734

Closed
Jake Bailey (jakebailey) wants to merge 23 commits into
microsoft:mainfrom
jakebailey:data-oriented-compiler
Closed

Jake Bailey (jakebailey) wants to merge 23 commits into
microsoft:mainfrom
jakebailey:data-oriented-compiler

Conversation

@jakebailey

@jakebailey Jake Bailey (jakebailey) commented Oct 11, 2026 •

Copy link
Copy Markdown
Member

Overall performance

The latest perf-bot run, with 12 iterations per revision, reports 22.15–29.66% lower memory usage across all nine scenarios. Allocation counts decrease in seven of nine scenarios, by 3.59–16.58%.

Scenario Memory used Allocation count Check time Total time
MUI docs −29.66% −16.58% −10.86% −9.39%
VS Code −27.19% −3.59% −2.88% No significant change
Webpack −25.65% −10.29% +3.25% No significant change

Allocation counts increase slightly for Compiler-Unions (+0.37%) and Angular (+1.24%). Error counts are unchanged across all nine scenarios.

Stack

This PR is the all-up view of the following stack; review the individual PRs.

  1. Keep optional type-node and signature state out of hot records #64801
  2. Bound arena retention by bytes instead of object count #64802
  3. Use paged indexes for type-node and signature caches #64803
  4. Reuse ordered property counts during intersection reduction #64804
  5. Lint writes to protected record kind fields #64791
  6. Compress paged link-store references #64775
  7. Index checker members without redundant symbol maps #64781
  8. Store ordinary relationship keys as exact type ID pairs #64788
  9. Share complete union and intersection property cache entries #64789
  10. Avoid short-lived allocations in union and intersection property handling #64815
  11. Use small slices for union and intersection property sources #64816
  12. Reuse name sets when enumerating union and intersection properties #64817

@typescript-automation typescript-automation Bot added Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug labels Oct 11, 2026
@jakebailey

Copy link
Copy Markdown
Member Author

TypeScript Bot (@typescript-bot) perf test this faster

@typescript-automation

typescript-automation Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this faster ✅ Started 👀 Results

@typescript-automation

Copy link
Copy Markdown
Contributor

Jake Bailey (@jakebailey)
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-Unions - native
Errors 41 41 ~ ~ ~ p=1.000 n=12
Symbols 115,276 115,276 ~ ~ ~ p=1.000 n=12
Types 79,613 79,613 ~ ~ ~ p=1.000 n=12
Memory Used 133,803k (± 0.04%) 125,133k (± 0.06%) 🟩-8,670k (- 6.48%) 124,988k 125,393k p=0.000 n=12
Memory Allocs 2,190,038 (± 0.01%) 2,034,432 (± 0.01%) 🟩-155,606 (- 7.11%) 2,034,076 2,035,016 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.039s (± 2.50%) 0.040s (± 3.86%) ~ 0.037s 0.044s p=0.991 n=12
Bind Time 0.012s (±11.68%) 0.013s (±12.23%) ~ 0.010s 0.018s p=0.177 n=12
Check Time 0.500s (± 0.68%) 0.477s (± 0.83%) 🟩-0.023s (- 4.62%) 0.469s 0.488s p=0.000 n=12
Emit Time 0.267s (± 2.95%) 0.255s (± 2.21%) 🟩-0.012s (- 4.64%) 0.242s 0.270s p=0.010 n=12
Total Time 0.824s (± 0.92%) 0.790s (± 0.58%) 🟩-0.035s (- 4.20%) 0.778s 0.804s p=0.000 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 845,677 (± 0.09%) 845,886 (± 0.05%) ~ 844,734 847,254 p=0.977 n=12
Types 248,126 (± 0.00%) 248,125 (± 0.00%) ~ 248,122 248,132 p=0.901 n=12
Memory Used 750,477k (± 0.02%) 698,056k (± 0.01%) 🟩-52,420k (- 6.98%) 697,852k 698,248k p=0.000 n=12
Memory Allocs 12,921,721 (± 0.10%) 12,242,893 (± 0.07%) 🟩-678,828 (- 5.25%) 12,233,363 12,273,563 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.258s (± 2.49%) 0.254s (± 2.78%) ~ 0.229s 0.269s p=0.541 n=12
Bind Time 0.065s (±11.85%) 0.064s (±12.72%) ~ 0.056s 0.098s p=0.299 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.573s (± 1.63%) 1.553s (± 1.01%) ~ 1.515s 1.612s p=0.284 n=12
Total Time 1.928s (± 1.72%) 1.900s (± 0.98%) ~ 1.861s 1.982s p=0.265 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,359,614 4,359,614 ~ ~ ~ p=1.000 n=12
Types 1,376,379 1,376,379 ~ ~ ~ p=1.000 n=12
Memory Used 2,813,796k (± 0.05%) 2,422,746k (± 0.06%) 🟩-391,050k (-13.90%) 2,418,931k 2,427,361k p=0.000 n=12
Memory Allocs 32,820,157 (± 0.05%) 27,783,754 (± 0.05%) 🟩-5,036,403 (-15.35%) 27,741,907 27,815,089 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.497s (± 2.91%) 0.496s (± 2.35%) ~ 0.461s 0.513s p=0.810 n=12
Bind Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Check Time 8.623s (± 0.55%) 8.584s (± 0.18%) ~ 8.542s 8.624s p=0.147 n=12
Emit Time 0.454s (± 9.62%) 0.423s (± 0.82%) 🟩-0.031s (- 6.84%) 0.420s 0.440s p=0.005 n=12
Total Time 10.360s (± 0.49%) 10.295s (± 0.09%) -0.066s (- 0.63%) 10.268s 10.323s p=0.037 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,390,229 1,390,229 ~ ~ ~ p=1.000 n=12
Types 441,498 441,498 ~ ~ ~ p=1.000 n=12
Memory Used 1,623,489k (± 0.85%) 1,544,833k (± 0.91%) 🟩-78,657k (- 4.84%) 1,522,631k 1,589,924k p=0.000 n=12
Memory Allocs 92,052,100 (± 0.17%) 81,839,740 (± 0.23%) 🟩-10,212,360 (-11.09%) 81,340,633 82,282,859 p=0.000 n=12
Config Time 0.003s (±18.68%) 0.004s (± 6.39%) ~ 0.003s 0.004s p=0.069 n=12
Parse Time 0.195s (± 3.79%) 0.190s (± 4.79%) ~ 0.172s 0.218s p=0.325 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.804s (± 0.74%) 1.769s (± 0.71%) -0.034s (- 1.90%) 1.745s 1.798s p=0.001 n=12
Emit Time 0.301s (± 4.36%) 0.314s (± 2.78%) ~ 0.289s 0.329s p=0.131 n=12
Total Time 23.456s (± 0.54%) 22.821s (± 0.39%) -0.635s (- 2.71%) 22.525s 23.054s p=0.000 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 334,953 334,953 ~ ~ ~ p=1.000 n=12
Types 197,616 197,616 ~ ~ ~ p=1.000 n=12
Memory Used 297,351k (± 0.02%) 277,550k (± 0.04%) 🟩-19,801k (- 6.66%) 277,294k 277,791k p=0.000 n=12
Memory Allocs 4,621,013 (± 0.01%) 4,062,288 (± 0.01%) 🟩-558,725 (-12.09%) 4,061,068 4,063,556 p=0.000 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.109s (± 5.44%) 0.110s (± 5.04%) ~ 0.095s 0.125s p=0.619 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.039s (± 0.38%) 1.010s (± 0.40%) -0.030s (- 2.85%) 1.001s 1.022s p=0.000 n=12
Emit Time 0.149s (± 6.38%) 0.128s (± 7.81%) 🟩-0.021s (-14.25%) 0.108s 0.158s p=0.006 n=12
Total Time 1.355s (± 0.76%) 1.301s (± 0.77%) 🟩-0.054s (- 3.96%) 1.274s 1.328s p=0.000 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 303,834 303,834 ~ ~ ~ p=1.000 n=12
Types 181,663 181,663 ~ ~ ~ p=1.000 n=12
Memory Used 258,176k (± 0.02%) 238,373k (± 0.02%) 🟩-19,803k (- 7.67%) 238,243k 238,462k p=0.000 n=12
Memory Allocs 1,613,636 (± 0.01%) 1,187,039 (± 0.02%) 🟩-426,598 (-26.44%) 1,186,672 1,187,554 p=0.000 n=12
Config Time 0.000s 0.000s (±217.90%) ~ 0.000s 0.001s p=1.000 n=12
Parse Time 0.098s (± 5.07%) 0.096s (± 4.08%) ~ 0.086s 0.104s p=0.579 n=12
Bind Time 0.038s (± 9.88%) 0.043s (± 9.35%) ~ 0.034s 0.053s p=0.061 n=12
Check Time 0.813s (± 0.59%) 0.797s (± 0.89%) -0.015s (- 1.87%) 0.787s 0.821s p=0.003 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.963s (± 0.60%) 0.951s (± 0.58%) -0.012s (- 1.23%) 0.937s 0.962s p=0.004 n=12
vscode - native
Errors 395 395 ~ ~ ~ p=1.000 n=12
Symbols 11,267,011 11,267,011 ~ ~ ~ p=1.000 n=12
Types 3,734,807 3,734,807 ~ ~ ~ p=1.000 n=12
Memory Used 6,512,655k (± 0.02%) 5,805,065k (± 0.01%) 🟩-707,590k (-10.86%) 5,803,771k 5,807,725k p=0.000 n=12
Memory Allocs 55,268,942 (± 0.02%) 46,350,060 (± 0.03%) 🟩-8,918,882 (-16.14%) 46,339,609 46,411,053 p=0.000 n=12
Config Time 0.075s 0.075s (± 0.33%) ~ 0.075s 0.076s p=0.478 n=12
Parse Time 1.861s (± 4.08%) 1.871s (± 4.18%) ~ 1.668s 2.010s p=0.854 n=12
Bind Time 0.593s (±20.31%) 0.577s (±20.65%) ~ 0.444s 0.941s p=0.679 n=12
Check Time 14.220s (± 1.29%) 13.851s (± 1.05%) -0.369s (- 2.59%) 13.525s 14.143s p=0.012 n=12
Emit Time 4.826s (±10.89%) 4.597s (± 8.43%) ~ 4.039s 5.622s p=0.370 n=12
Total Time 21.663s (± 1.88%) 21.056s (± 1.55%) -0.607s (- 2.80%) 20.489s 22.032s p=0.004 n=12
webpack - native
Errors 583 583 ~ ~ ~ p=1.000 n=12
Symbols 1,310,251 1,310,251 ~ ~ ~ p=1.000 n=12
Types 618,116 618,116 ~ ~ ~ p=1.000 n=12
Memory Used 938,615k (± 0.02%) 836,974k (± 0.02%) 🟩-101,640k (-10.83%) 836,594k 837,297k p=0.000 n=12
Memory Allocs 6,624,350 (± 0.02%) 5,370,326 (± 0.04%) 🟩-1,254,025 (-18.93%) 5,368,145 5,380,129 p=0.000 n=12
Config Time 0.009s (± 3.96%) 0.009s (± 5.25%) ~ 0.009s 0.011s p=1.000 n=12
Parse Time 0.294s (± 3.91%) 0.301s (± 4.31%) ~ 0.277s 0.336s p=0.619 n=12
Bind Time 0.083s (±18.52%) 0.095s (±16.82%) ~ 0.067s 0.140s p=0.102 n=12
Check Time 1.999s (± 1.34%) 2.043s (± 2.28%) ~ 1.961s 2.212s p=0.091 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.419s (± 0.96%) 2.485s (± 2.00%) +0.065s (+ 2.70%) 2.409s 2.659s p=0.014 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,061,928 1,061,928 ~ ~ ~ p=1.000 n=12
Types 389,645 389,645 ~ ~ ~ p=1.000 n=12
Memory Used 554,310k (± 0.02%) 482,407k (± 0.04%) 🟩-71,903k (-12.97%) 482,094k 482,929k p=0.000 n=12
Memory Allocs 4,886,438 (± 0.09%) 3,790,173 (± 0.09%) 🟩-1,096,265 (-22.43%) 3,783,016 3,798,719 p=0.000 n=12
Config Time 0.003s 0.003s ~ ~ ~ p=1.000 n=12
Parse Time 0.145s (± 4.19%) 0.149s (± 4.75%) ~ 0.135s 0.171s p=0.619 n=12
Bind Time 0.043s (±19.11%) 0.048s (±21.07%) ~ 0.033s 0.078s p=0.197 n=12
Check Time 1.122s (± 0.52%) 1.109s (± 1.16%) ~ 1.084s 1.155s p=0.062 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.320s (± 0.81%) 1.318s (± 1.45%) ~ 1.280s 1.383s p=0.369 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • strada-build-src - native
  • strada-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 12
Baseline baseline 12

Developer Information:

Download Benchmarks

@jakebailey

Copy link
Copy Markdown
Member Author

TypeScript Bot (@typescript-bot) perf test this faster

@typescript-automation

typescript-automation Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this faster ✅ Started 👀 Results

@typescript-automation

Copy link
Copy Markdown
Contributor

Jake Bailey (@jakebailey)
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-Unions - native
Errors 41 41 ~ ~ ~ p=1.000 n=12
Symbols 115,276 115,276 ~ ~ ~ p=1.000 n=12
Types 79,613 79,613 ~ ~ ~ p=1.000 n=12
Memory Used 133,852k (± 0.07%) 117,500k (± 0.05%) 🟩-16,352k (-12.22%) 117,410k 117,712k p=0.000 n=12
Memory Allocs 2,189,976 (± 0.00%) 2,034,349 (± 0.01%) 🟩-155,627 (- 7.11%) 2,034,045 2,035,198 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.041s (± 2.64%) 0.037s (± 3.08%) 🟩-0.003s (- 7.98%) 0.034s 0.041s p=0.000 n=12
Bind Time 0.013s (±13.82%) 0.012s (±11.85%) ~ 0.010s 0.018s p=0.780 n=12
Check Time 0.497s (± 0.65%) 0.487s (± 0.93%) -0.010s (- 2.03%) 0.477s 0.496s p=0.001 n=12
Emit Time 0.274s (± 1.77%) 0.261s (± 1.71%) 🟩-0.013s (- 4.68%) 0.249s 0.274s p=0.000 n=12
Total Time 0.831s (± 0.71%) 0.804s (± 0.48%) 🟩-0.026s (- 3.18%) 0.790s 0.814s p=0.000 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 845,592 (± 0.09%) 845,712 (± 0.07%) ~ 843,849 847,277 p=0.755 n=12
Types 248,125 (± 0.00%) 248,125 (± 0.00%) ~ 248,122 248,133 p=1.000 n=12
Memory Used 750,428k (± 0.03%) 640,898k (± 0.01%) 🟩-109,530k (-14.60%) 640,729k 641,086k p=0.000 n=12
Memory Allocs 12,919,428 (± 0.05%) 12,241,009 (± 0.05%) 🟩-678,419 (- 5.25%) 12,233,172 12,261,372 p=0.000 n=12
Config Time 0.017s 0.017s (± 1.70%) ~ 0.016s 0.017s p=0.217 n=12
Parse Time 0.260s (± 2.56%) 0.243s (± 3.00%) 🟩-0.017s (- 6.70%) 0.222s 0.261s p=0.000 n=12
Bind Time 0.060s (± 9.66%) 0.063s (±14.18%) ~ 0.055s 0.095s p=0.374 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.556s (± 0.53%) 1.581s (± 1.15%) +0.025s (+ 1.61%) 1.535s 1.631s p=0.019 n=12
Total Time 1.905s (± 0.57%) 1.917s (± 1.33%) ~ 1.861s 1.992s p=0.523 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,359,614 4,359,614 ~ ~ ~ p=1.000 n=12
Types 1,376,379 1,376,379 ~ ~ ~ p=1.000 n=12
Memory Used 2,813,532k (± 0.04%) 2,367,720k (± 0.07%) 🟩-445,812k (-15.85%) 2,364,186k 2,371,864k p=0.000 n=12
Memory Allocs 32,835,994 (± 0.10%) 27,821,991 (± 0.14%) 🟩-5,014,003 (-15.27%) 27,757,874 27,985,117 p=0.000 n=12
Config Time 0.017s 0.017s (± 1.45%) ~ 0.016s 0.017s p=0.478 n=12
Parse Time 0.488s (± 3.25%) 0.490s (± 2.48%) ~ 0.443s 0.512s p=1.000 n=12
Bind Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Check Time 8.658s (± 0.48%) 8.781s (± 0.51%) +0.123s (+ 1.42%) 8.650s 8.848s p=0.000 n=12
Emit Time 0.447s (± 6.47%) 0.470s (±11.21%) ~ 0.420s 0.615s p=0.172 n=12
Total Time 10.381s (± 0.48%) 10.508s (± 0.32%) +0.128s (+ 1.23%) 10.381s 10.560s p=0.000 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,390,229 1,390,229 ~ ~ ~ p=1.000 n=12
Types 441,498 441,498 ~ ~ ~ p=1.000 n=12
Memory Used 1,625,134k (± 0.90%) 1,428,447k (± 0.68%) 🟩-196,687k (-12.10%) 1,413,413k 1,463,533k p=0.000 n=12
Memory Allocs 92,035,904 (± 0.20%) 81,875,639 (± 0.17%) 🟩-10,160,266 (-11.04%) 81,587,387 82,233,700 p=0.000 n=12
Config Time 0.003s (±15.49%) 0.003s (±12.31%) ~ 0.002s 0.004s p=0.227 n=12
Parse Time 0.197s (± 3.28%) 0.183s (± 3.20%) 🟩-0.013s (- 6.74%) 0.167s 0.194s p=0.002 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.803s (± 0.62%) 1.796s (± 0.63%) ~ 1.768s 1.835s p=0.247 n=12
Emit Time 0.309s (± 4.28%) 0.316s (± 2.89%) ~ 0.290s 0.333s p=0.469 n=12
Total Time 23.547s (± 0.61%) 22.949s (± 0.42%) -0.598s (- 2.54%) 22.695s 23.219s p=0.000 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 334,953 334,953 ~ ~ ~ p=1.000 n=12
Types 197,616 197,616 ~ ~ ~ p=1.000 n=12
Memory Used 297,376k (± 0.02%) 258,302k (± 0.02%) 🟩-39,074k (-13.14%) 258,200k 258,413k p=0.000 n=12
Memory Allocs 4,621,046 (± 0.01%) 4,062,479 (± 0.01%) 🟩-558,566 (-12.09%) 4,061,538 4,063,423 p=0.000 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.114s (± 5.48%) 0.107s (± 2.96%) ~ 0.100s 0.115s p=0.070 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.042s (± 0.61%) 1.033s (± 0.49%) -0.009s (- 0.88%) 1.026s 1.049s p=0.017 n=12
Emit Time 0.140s (± 8.33%) 0.140s (± 3.99%) ~ 0.120s 0.157s p=0.809 n=12
Total Time 1.348s (± 0.87%) 1.330s (± 0.76%) -0.018s (- 1.34%) 1.309s 1.363s p=0.025 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 303,834 303,834 ~ ~ ~ p=1.000 n=12
Types 181,663 181,663 ~ ~ ~ p=1.000 n=12
Memory Used 258,169k (± 0.01%) 222,060k (± 0.02%) 🟩-36,109k (-13.99%) 221,974k 222,173k p=0.000 n=12
Memory Allocs 1,613,482 (± 0.01%) 1,187,169 (± 0.02%) 🟩-426,313 (-26.42%) 1,186,684 1,187,957 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.099s (± 4.09%) 0.091s (± 3.56%) 🟩-0.008s (- 8.50%) 0.083s 0.100s p=0.005 n=12
Bind Time 0.038s (±10.34%) 0.037s (±11.20%) ~ 0.028s 0.050s p=0.598 n=12
Check Time 0.818s (± 0.80%) 0.821s (± 0.69%) ~ 0.808s 0.840s p=0.521 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.969s (± 0.84%) 0.962s (± 0.69%) ~ 0.944s 0.981s p=0.234 n=12
vscode - native
Errors 395 395 ~ ~ ~ p=1.000 n=12
Symbols 11,267,011 11,267,011 ~ ~ ~ p=1.000 n=12
Types 3,734,807 3,734,807 ~ ~ ~ p=1.000 n=12
Memory Used 6,512,004k (± 0.02%) 5,423,329k (± 0.02%) 🟩-1,088,675k (-16.72%) 5,421,718k 5,428,744k p=0.000 n=12
Memory Allocs 55,277,174 (± 0.03%) 46,352,448 (± 0.02%) 🟩-8,924,726 (-16.15%) 46,338,482 46,402,668 p=0.000 n=12
Config Time 0.075s (± 0.33%) 0.074s (± 0.44%) ~ 0.074s 0.075s p=0.089 n=12
Parse Time 1.810s (± 3.26%) 1.711s (± 3.48%) 🟩-0.099s (- 5.49%) 1.583s 1.875s p=0.024 n=12
Bind Time 0.618s (±19.67%) 0.600s (±18.65%) ~ 0.436s 0.920s p=0.811 n=12
Check Time 14.163s (± 1.28%) 13.810s (± 0.92%) -0.353s (- 2.49%) 13.535s 14.057s p=0.006 n=12
Emit Time 5.134s (± 9.45%) 5.196s (± 9.72%) ~ 4.177s 5.916s p=0.843 n=12
Total Time 21.888s (± 1.74%) 21.481s (± 1.99%) ~ 20.551s 22.082s p=0.192 n=12
webpack - native
Errors 583 583 ~ ~ ~ p=1.000 n=12
Symbols 1,310,251 1,310,251 ~ ~ ~ p=1.000 n=12
Types 618,116 618,116 ~ ~ ~ p=1.000 n=12
Memory Used 938,625k (± 0.01%) 781,561k (± 0.01%) 🟩-157,064k (-16.73%) 781,380k 781,958k p=0.000 n=12
Memory Allocs 6,624,096 (± 0.02%) 5,369,434 (± 0.02%) 🟩-1,254,662 (-18.94%) 5,366,370 5,372,100 p=0.000 n=12
Config Time 0.009s 0.009s ~ ~ ~ p=1.000 n=12
Parse Time 0.291s (± 2.82%) 0.286s (± 2.83%) ~ 0.263s 0.307s p=0.504 n=12
Bind Time 0.081s (±16.28%) 0.075s (±15.51%) ~ 0.062s 0.128s p=0.338 n=12
Check Time 2.000s (± 0.96%) 2.008s (± 0.65%) ~ 1.979s 2.046s p=0.744 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.416s (± 0.54%) 2.416s (± 0.66%) ~ 2.391s 2.478s p=0.876 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,061,928 1,061,928 ~ ~ ~ p=1.000 n=12
Types 389,645 389,645 ~ ~ ~ p=1.000 n=12
Memory Used 554,243k (± 0.02%) 458,722k (± 0.03%) 🟩-95,522k (-17.23%) 458,476k 459,220k p=0.000 n=12
Memory Allocs 4,886,102 (± 0.07%) 3,787,351 (± 0.10%) 🟩-1,098,751 (-22.49%) 3,779,778 3,795,388 p=0.000 n=12
Config Time 0.003s 0.003s (± 8.64%) ~ 0.002s 0.003s p=0.478 n=12
Parse Time 0.141s (± 3.48%) 0.135s (± 2.26%) 🟩-0.006s (- 4.53%) 0.127s 0.142s p=0.027 n=12
Bind Time 0.047s (±19.14%) 0.039s (±13.66%) ~ 0.031s 0.056s p=0.163 n=12
Check Time 1.129s (± 0.69%) 1.100s (± 0.79%) -0.029s (- 2.55%) 1.087s 1.129s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.330s (± 0.91%) 1.288s (± 0.65%) 🟩-0.042s (- 3.14%) 1.262s 1.309s p=0.000 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • strada-build-src - native
  • strada-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 12
Baseline baseline 12

Developer Information:

Download Benchmarks

@jakebailey

Copy link
Copy Markdown
Member Author

TypeScript Bot (@typescript-bot) perf test this faster

@typescript-automation

typescript-automation Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this faster ✅ Started 👀 Results

@typescript-automation

Copy link
Copy Markdown
Contributor

Jake Bailey (@jakebailey)
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-Unions - native
Errors 41 41 ~ ~ ~ p=1.000 n=12
Symbols 115,276 94,933 🟩-20,343 (-17.65%) ~ ~ p=0.000 n=12
Types 79,613 79,613 ~ ~ ~ p=1.000 n=12
Memory Used 133,858k (± 0.03%) 115,512k (± 0.05%) 🟩-18,346k (-13.71%) 115,407k 115,652k p=0.000 n=12
Memory Allocs 2,190,149 (± 0.01%) 2,056,888 (± 0.01%) 🟩-133,261 (- 6.08%) 2,056,653 2,057,151 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.040s (± 5.97%) 0.038s (± 2.56%) ~ 0.036s 0.041s p=0.336 n=12
Bind Time 0.012s (±13.20%) 0.011s (± 5.74%) ~ 0.010s 0.012s p=0.431 n=12
Check Time 0.500s (± 0.76%) 0.489s (± 0.54%) -0.010s (- 2.07%) 0.486s 0.498s p=0.000 n=12
Emit Time 0.273s (± 1.87%) 0.268s (± 2.00%) ~ 0.256s 0.282s p=0.131 n=12
Total Time 0.830s (± 0.68%) 0.812s (± 0.62%) -0.018s (- 2.21%) 0.801s 0.831s p=0.000 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 845,208 (± 0.09%) 632,796 (± 0.03%) 🟩-212,412 (-25.13%) 632,412 633,255 p=0.000 n=12
Types 248,125 (± 0.00%) 248,126 (± 0.00%) ~ 248,122 248,136 p=0.851 n=12
Memory Used 750,333k (± 0.02%) 617,373k (± 0.02%) 🟩-132,960k (-17.72%) 617,182k 617,764k p=0.000 n=12
Memory Allocs 12,918,167 (± 0.08%) 12,367,382 (± 0.02%) 🟩-550,785 (- 4.26%) 12,361,957 12,375,459 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.260s (± 1.49%) 0.241s (± 2.48%) 🟩-0.019s (- 7.33%) 0.225s 0.254s p=0.000 n=12
Bind Time 0.058s (± 0.94%) 0.058s (± 7.62%) +0.001s (+ 1.01%) 0.055s 0.079s p=0.007 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.557s (± 0.58%) 1.570s (± 1.96%) ~ 1.510s 1.662s p=0.944 n=12
Total Time 1.903s (± 0.53%) 1.899s (± 1.67%) ~ 1.834s 1.975s p=0.401 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,359,614 4,156,944 🟩-202,670 (- 4.65%) ~ ~ p=0.000 n=12
Types 1,376,379 1,376,379 ~ ~ ~ p=1.000 n=12
Memory Used 2,813,847k (± 0.04%) 2,310,970k (± 0.06%) 🟩-502,877k (-17.87%) 2,308,317k 2,314,701k p=0.000 n=12
Memory Allocs 32,831,491 (± 0.07%) 28,366,731 (± 0.08%) 🟩-4,464,760 (-13.60%) 28,320,867 28,439,156 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.496s (± 2.56%) 0.479s (± 2.43%) ~ 0.455s 0.512s p=0.066 n=12
Bind Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Check Time 8.613s (± 0.60%) 9.419s (± 0.34%) 🔻+0.806s (+ 9.36%) 9.277s 9.478s p=0.000 n=12
Emit Time 0.482s (± 9.70%) 0.425s (± 0.43%) 🟩-0.058s (-11.93%) 0.420s 0.429s p=0.003 n=12
Total Time 10.383s (± 0.49%) 11.088s (± 0.37%) 🔻+0.705s (+ 6.79%) 10.904s 11.174s p=0.000 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,390,229 1,242,234 🟩-147,995 (-10.65%) ~ ~ p=0.000 n=12
Types 441,498 441,498 ~ ~ ~ p=1.000 n=12
Memory Used 1,618,221k (± 0.55%) 1,389,721k (± 0.25%) 🟩-228,500k (-14.12%) 1,378,292k 1,397,026k p=0.000 n=12
Memory Allocs 91,951,986 (± 0.17%) 82,821,244 (± 0.13%) 🟩-9,130,742 (- 9.93%) 82,577,853 83,053,086 p=0.000 n=12
Config Time 0.003s (±10.50%) 0.004s (± 9.48%) 🔻+0.001s (+29.73%) 0.003s 0.005s p=0.002 n=12
Parse Time 0.186s (± 2.55%) 0.183s (± 2.18%) ~ 0.171s 0.193s p=0.384 n=12
Bind Time 0.000s (±217.90%) 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.814s (± 0.61%) 1.789s (± 0.40%) -0.025s (- 1.38%) 1.772s 1.815s p=0.001 n=12
Emit Time 0.304s (± 3.91%) 0.315s (± 3.43%) ~ 0.291s 0.340s p=0.247 n=12
Total Time 23.402s (± 0.38%) 22.827s (± 0.66%) -0.575s (- 2.46%) 22.491s 23.277s p=0.000 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 334,953 285,011 🟩-49,942 (-14.91%) ~ ~ p=0.000 n=12
Types 197,616 197,616 ~ ~ ~ p=1.000 n=12
Memory Used 297,376k (± 0.02%) 252,320k (± 0.01%) 🟩-45,056k (-15.15%) 252,241k 252,400k p=0.000 n=12
Memory Allocs 4,621,456 (± 0.01%) 4,108,355 (± 0.01%) 🟩-513,101 (-11.10%) 4,107,518 4,109,094 p=0.000 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.117s (± 3.68%) 0.106s (± 5.47%) 🟩-0.012s (-10.01%) 0.094s 0.122s p=0.003 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.040s (± 0.29%) 1.026s (± 0.48%) -0.014s (- 1.30%) 1.014s 1.039s p=0.000 n=12
Emit Time 0.143s (± 8.54%) 0.141s (± 1.14%) ~ 0.136s 0.145s p=0.966 n=12
Total Time 1.352s (± 0.91%) 1.318s (± 0.64%) -0.033s (- 2.47%) 1.303s 1.343s p=0.000 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 303,834 256,365 🟩-47,469 (-15.62%) ~ ~ p=0.000 n=12
Types 181,663 181,663 ~ ~ ~ p=1.000 n=12
Memory Used 258,119k (± 0.02%) 217,006k (± 0.01%) 🟩-41,113k (-15.93%) 216,928k 217,083k p=0.000 n=12
Memory Allocs 1,613,566 (± 0.01%) 1,231,859 (± 0.02%) 🟩-381,707 (-23.66%) 1,231,399 1,232,491 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.101s (± 3.90%) 0.090s (± 2.45%) 🟩-0.011s (-10.79%) 0.086s 0.098s p=0.000 n=12
Bind Time 0.035s (± 9.10%) 0.037s (±10.30%) ~ 0.031s 0.047s p=0.541 n=12
Check Time 0.815s (± 0.77%) 0.811s (± 0.83%) ~ 0.794s 0.830s p=0.311 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.965s (± 0.80%) 0.952s (± 0.45%) -0.013s (- 1.38%) 0.943s 0.963s p=0.006 n=12
vscode - native
Errors 395 395 ~ ~ ~ p=1.000 n=12
Symbols 11,183,338 8,221,517 🟩-2,961,821 (-26.48%) ~ ~ p=0.000 n=12
Types 3,710,990 3,710,990 ~ ~ ~ p=1.000 n=12
Memory Used 6,490,115k (± 0.01%) 5,099,257k (± 0.02%) 🟩-1,390,859k (-21.43%) 5,097,374k 5,102,244k p=0.000 n=12
Memory Allocs 55,152,736 (± 0.01%) 47,863,796 (± 0.04%) 🟩-7,288,940 (-13.22%) 47,833,536 47,906,364 p=0.000 n=12
Config Time 0.075s (± 0.51%) 0.075s (± 0.43%) ~ 0.074s 0.076s p=0.963 n=12
Parse Time 1.840s (± 2.18%) 1.742s (± 3.24%) 🟩-0.098s (- 5.33%) 1.596s 1.868s p=0.004 n=12
Bind Time 0.539s (±11.43%) 0.554s (±20.37%) ~ 0.429s 0.906s p=0.260 n=12
Check Time 13.890s (± 0.66%) 13.603s (± 0.65%) -0.287s (- 2.06%) 13.343s 13.768s p=0.000 n=12
Emit Time 4.903s (±10.71%) 5.312s (± 7.62%) ~ 4.300s 5.953s p=0.160 n=12
Total Time 21.336s (± 2.18%) 21.369s (± 1.72%) ~ 20.424s 22.027s p=0.810 n=12
webpack - native
Errors 583 583 ~ ~ ~ p=1.000 n=12
Symbols 1,310,251 1,103,596 🟩-206,655 (-15.77%) ~ ~ p=0.000 n=12
Types 618,116 618,116 ~ ~ ~ p=1.000 n=12
Memory Used 938,645k (± 0.02%) 758,255k (± 0.02%) 🟩-180,391k (-19.22%) 757,886k 758,742k p=0.000 n=12
Memory Allocs 6,624,457 (± 0.02%) 5,627,294 (± 0.04%) 🟩-997,163 (-15.05%) 5,623,995 5,635,050 p=0.000 n=12
Config Time 0.009s 0.009s ~ ~ ~ p=1.000 n=12
Parse Time 0.304s (± 3.47%) 0.279s (± 3.08%) 🟩-0.025s (- 8.33%) 0.251s 0.297s p=0.001 n=12
Bind Time 0.078s (±18.44%) 0.073s (±15.83%) ~ 0.060s 0.108s p=0.338 n=12
Check Time 2.004s (± 1.05%) 2.119s (± 0.24%) 🔻+0.115s (+ 5.75%) 2.105s 2.135s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.430s (± 0.66%) 2.516s (± 0.46%) +0.086s (+ 3.54%) 2.490s 2.552s p=0.000 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,061,928 815,636 🟩-246,292 (-23.19%) ~ ~ p=0.000 n=12
Types 389,645 389,645 ~ ~ ~ p=1.000 n=12
Memory Used 554,383k (± 0.02%) 436,063k (± 0.03%) 🟩-118,320k (-21.34%) 435,861k 436,321k p=0.000 n=12
Memory Allocs 4,887,281 (± 0.07%) 4,059,206 (± 0.10%) 🟩-828,075 (-16.94%) 4,050,318 4,072,713 p=0.000 n=12
Config Time 0.003s 0.003s (±10.34%) ~ 0.002s 0.003s p=0.217 n=12
Parse Time 0.146s (± 3.15%) 0.139s (± 3.13%) ~ 0.128s 0.150s p=0.085 n=12
Bind Time 0.044s (±15.47%) 0.040s (±18.29%) ~ 0.031s 0.066s p=0.075 n=12
Check Time 1.134s (± 0.88%) 1.142s (± 0.92%) ~ 1.116s 1.164s p=0.247 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.336s (± 0.82%) 1.333s (± 0.44%) ~ 1.320s 1.348s p=0.486 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • strada-build-src - native
  • strada-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 12
Baseline baseline 12

Developer Information:

Download Benchmarks

@jakebailey

Copy link
Copy Markdown
Member Author

TypeScript Bot (@typescript-bot) perf test this faster

@typescript-automation

typescript-automation Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this faster ✅ Started 👀 Results

@typescript-automation

Copy link
Copy Markdown
Contributor

Jake Bailey (@jakebailey)
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-Unions - native
Errors 41 41 ~ ~ ~ p=1.000 n=12
Symbols 115,276 94,933 🟩-20,343 (-17.65%) ~ ~ p=0.000 n=12
Types 79,613 79,613 ~ ~ ~ p=1.000 n=12
Memory Used 133,853k (± 0.06%) 107,060k (± 0.06%) 🟩-26,793k (-20.02%) 106,942k 107,257k p=0.000 n=12
Memory Allocs 2,190,089 (± 0.01%) 2,230,720 (± 0.01%) +40,631 (+ 1.86%) 2,230,364 2,230,988 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.040s (± 4.56%) 0.040s (± 5.05%) ~ 0.036s 0.046s p=0.990 n=12
Bind Time 0.013s (±14.15%) 0.014s (±10.34%) ~ 0.011s 0.018s p=0.334 n=12
Check Time 0.502s (± 0.94%) 0.488s (± 0.67%) -0.014s (- 2.81%) 0.477s 0.494s p=0.000 n=12
Emit Time 0.264s (± 2.17%) 0.267s (± 2.39%) ~ 0.259s 0.293s p=0.521 n=12
Total Time 0.824s (± 0.74%) 0.814s (± 0.91%) -0.010s (- 1.18%) 0.800s 0.843s p=0.032 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 845,874 (± 0.07%) 632,796 (± 0.04%) 🟩-213,078 (-25.19%) 632,284 633,476 p=0.000 n=12
Types 248,124 (± 0.00%) 248,125 (± 0.00%) ~ 248,122 248,136 p=0.746 n=12
Memory Used 750,446k (± 0.02%) 544,157k (± 0.01%) 🟩-206,290k (-27.49%) 543,981k 544,399k p=0.000 n=12
Memory Allocs 12,919,294 (± 0.08%) 13,235,462 (± 0.07%) +316,168 (+ 2.45%) 13,227,097 13,280,337 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.257s (± 2.53%) 0.217s (± 1.96%) 🟩-0.040s (-15.71%) 0.209s 0.229s p=0.000 n=12
Bind Time 0.062s (±13.58%) 0.099s (± 9.38%) 🔻+0.037s (+59.46%) 0.068s 0.115s p=0.000 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.563s (± 1.17%) 1.584s (± 0.90%) +0.021s (+ 1.35%) 1.551s 1.629s p=0.037 n=12
Total Time 1.911s (± 1.17%) 1.935s (± 0.65%) +0.023s (+ 1.22%) 1.897s 1.968s p=0.010 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,359,614 4,156,944 🟩-202,670 (- 4.65%) ~ ~ p=0.000 n=12
Types 1,376,379 1,376,379 ~ ~ ~ p=1.000 n=12
Memory Used 2,812,975k (± 0.06%) 2,179,113k (± 0.05%) 🟩-633,862k (-22.53%) 2,176,722k 2,182,702k p=0.000 n=12
Memory Allocs 32,810,258 (± 0.05%) 29,933,331 (± 0.04%) 🟩-2,876,927 (- 8.77%) 29,898,380 29,960,296 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.491s (± 3.94%) 0.477s (± 3.19%) ~ 0.426s 0.526s p=0.173 n=12
Bind Time 0.002s 0.002s (±37.57%) ~ 0.002s 0.007s p=1.000 n=12
Check Time 8.612s (± 0.61%) 9.455s (± 0.37%) 🔻+0.844s (+ 9.80%) 9.369s 9.516s p=0.000 n=12
Emit Time 0.462s (± 9.92%) 0.421s (± 0.33%) 🟩-0.041s (- 8.94%) 0.416s 0.424s p=0.003 n=12
Total Time 10.349s (± 0.69%) 11.115s (± 0.42%) 🔻+0.766s (+ 7.40%) 10.975s 11.197s p=0.000 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,390,229 1,242,234 🟩-147,995 (-10.65%) ~ ~ p=0.000 n=12
Types 441,498 441,498 ~ ~ ~ p=1.000 n=12
Memory Used 1,627,246k (± 0.86%) 1,254,515k (± 0.64%) 🟩-372,732k (-22.91%) 1,239,328k 1,282,590k p=0.000 n=12
Memory Allocs 92,046,449 (± 0.17%) 88,295,940 (± 0.15%) 🟩-3,750,509 (- 4.07%) 87,951,691 88,684,463 p=0.000 n=12
Config Time 0.003s (±14.26%) 0.003s (±14.59%) ~ 0.002s 0.004s p=0.874 n=12
Parse Time 0.193s (± 3.21%) 0.187s (± 3.05%) ~ 0.174s 0.205s p=0.147 n=12
Bind Time 0.000s (±217.90%) 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.809s (± 0.54%) 1.800s (± 0.56%) ~ 1.782s 1.828s p=0.128 n=12
Emit Time 0.306s (± 3.28%) 0.312s (± 2.81%) ~ 0.288s 0.334s p=0.284 n=12
Total Time 23.461s (± 0.50%) 23.263s (± 0.54%) -0.197s (- 0.84%) 22.886s 23.554s p=0.039 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 334,953 285,011 🟩-49,942 (-14.91%) ~ ~ p=0.000 n=12
Types 197,616 197,616 ~ ~ ~ p=1.000 n=12
Memory Used 297,328k (± 0.02%) 232,523k (± 0.03%) 🟩-64,805k (-21.80%) 232,373k 232,769k p=0.000 n=12
Memory Allocs 4,621,013 (± 0.01%) 4,386,464 (± 0.01%) 🟩-234,549 (- 5.08%) 4,385,917 4,387,339 p=0.000 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.112s (± 3.82%) 0.109s (± 4.05%) ~ 0.097s 0.122s p=0.258 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.040s (± 0.56%) 1.040s (± 0.63%) ~ 1.022s 1.053s p=0.943 n=12
Emit Time 0.142s (± 6.62%) 0.136s (±10.95%) ~ 0.097s 0.163s p=0.898 n=12
Total Time 1.348s (± 1.05%) 1.342s (± 0.93%) ~ 1.299s 1.365s p=0.832 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 303,834 256,365 🟩-47,469 (-15.62%) ~ ~ p=0.000 n=12
Types 181,663 181,663 ~ ~ ~ p=1.000 n=12
Memory Used 258,133k (± 0.01%) 199,919k (± 0.01%) 🟩-58,214k (-22.55%) 199,843k 199,988k p=0.000 n=12
Memory Allocs 1,613,693 (± 0.01%) 1,460,506 (± 0.01%) 🟩-153,187 (- 9.49%) 1,460,034 1,461,120 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.100s (± 3.97%) 0.096s (± 4.38%) ~ 0.087s 0.108s p=0.097 n=12
Bind Time 0.039s (±13.11%) 0.040s (± 9.78%) ~ 0.030s 0.048s p=0.580 n=12
Check Time 0.817s (± 0.81%) 0.817s (± 0.55%) ~ 0.803s 0.828s p=0.809 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.971s (± 0.90%) 0.967s (± 0.76%) ~ 0.950s 0.987s p=0.542 n=12
vscode - native
Errors 395 395 ~ ~ ~ p=1.000 n=12
Symbols 11,251,632 8,277,461 🟩-2,974,171 (-26.43%) ~ ~ p=0.000 n=12
Types 3,734,289 3,734,289 ~ ~ ~ p=1.000 n=12
Memory Used 6,510,406k (± 0.01%) 4,533,568k (± 0.02%) 🟩-1,976,838k (-30.36%) 4,532,003k 4,537,209k p=0.000 n=12
Memory Allocs 55,322,973 (± 0.02%) 55,006,824 (± 0.02%) -316,149 (- 0.57%) 54,993,680 55,043,114 p=0.000 n=12
Config Time 0.075s (± 0.72%) 0.075s (± 0.43%) ~ 0.074s 0.076s p=0.682 n=12
Parse Time 1.883s (± 3.38%) 1.677s (± 3.00%) 🟩-0.207s (-10.97%) 1.582s 1.819s p=0.000 n=12
Bind Time 0.528s (±18.45%) 0.623s (±15.12%) 🔻+0.094s (+17.85%) 0.454s 0.819s p=0.017 n=12
Check Time 13.911s (± 0.93%) 13.642s (± 0.79%) -0.268s (- 1.93%) 13.486s 14.008s p=0.005 n=12
Emit Time 4.563s (± 9.38%) 5.122s (± 3.62%) 🔻+0.560s (+12.27%) 4.835s 5.752s p=0.020 n=12
Total Time 21.038s (± 1.73%) 21.222s (± 1.16%) +0.183s (+ 0.87%) 20.886s 22.137s p=0.014 n=12
webpack - native
Errors 583 583 ~ ~ ~ p=1.000 n=12
Symbols 1,310,251 1,103,596 🟩-206,655 (-15.77%) ~ ~ p=0.000 n=12
Types 618,116 618,116 ~ ~ ~ p=1.000 n=12
Memory Used 938,662k (± 0.01%) 692,705k (± 0.02%) 🟩-245,958k (-26.20%) 692,263k 693,059k p=0.000 n=12
Memory Allocs 6,625,296 (± 0.02%) 6,335,722 (± 0.01%) 🟩-289,574 (- 4.37%) 6,333,805 6,337,956 p=0.000 n=12
Config Time 0.009s 0.009s ~ ~ ~ p=1.000 n=12
Parse Time 0.293s (± 2.42%) 0.286s (± 2.71%) ~ 0.266s 0.309s p=0.124 n=12
Bind Time 0.081s (±19.22%) 0.070s (± 2.07%) ~ 0.067s 0.076s p=0.921 n=12
Check Time 1.997s (± 0.95%) 2.150s (± 0.56%) 🔻+0.153s (+ 7.66%) 2.136s 2.197s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.415s (± 0.49%) 2.548s (± 0.63%) 🔻+0.133s (+ 5.50%) 2.521s 2.606s p=0.000 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,061,928 815,636 🟩-246,292 (-23.19%) ~ ~ p=0.000 n=12
Types 389,645 389,645 ~ ~ ~ p=1.000 n=12
Memory Used 554,419k (± 0.02%) 395,313k (± 0.03%) 🟩-159,105k (-28.70%) 395,112k 395,642k p=0.000 n=12
Memory Allocs 4,885,075 (± 0.08%) 4,444,680 (± 0.07%) 🟩-440,395 (- 9.02%) 4,439,160 4,450,744 p=0.000 n=12
Config Time 0.003s 0.003s ~ ~ ~ p=1.000 n=12
Parse Time 0.141s (± 2.90%) 0.134s (± 2.94%) 🟩-0.007s (- 5.01%) 0.126s 0.145s p=0.018 n=12
Bind Time 0.046s (±18.07%) 0.045s (±14.93%) ~ 0.033s 0.065s p=0.854 n=12
Check Time 1.130s (± 0.54%) 1.159s (± 1.11%) +0.029s (+ 2.57%) 1.127s 1.185s p=0.001 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.330s (± 0.75%) 1.348s (± 0.67%) +0.018s (+ 1.34%) 1.321s 1.365s p=0.013 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • strada-build-src - native
  • strada-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 12
Baseline baseline 12

Developer Information:

Download Benchmarks

@jakebailey

Copy link
Copy Markdown
Member Author

CPU regression appears to be due to #64735

@jakebailey

Copy link
Copy Markdown
Member Author

TypeScript Bot (@typescript-bot) perf test this faster

@typescript-automation

typescript-automation Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this faster ✅ Started 👀 Results

@typescript-automation

Copy link
Copy Markdown
Contributor

Jake Bailey (@jakebailey)
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-Unions - native
Errors 41 41 ~ ~ ~ p=1.000 n=12
Symbols 115,276 94,933 🟩-20,343 (-17.65%) ~ ~ p=0.000 n=12
Types 79,613 79,613 ~ ~ ~ p=1.000 n=12
Memory Used 133,834k (± 0.06%) 101,788k (± 0.05%) 🟩-32,045k (-23.94%) 101,708k 101,941k p=0.000 n=12
Memory Allocs 2,189,988 (± 0.01%) 2,225,259 (± 0.01%) +35,271 (+ 1.61%) 2,224,923 2,225,675 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.040s (± 3.91%) 0.040s (± 3.13%) ~ 0.037s 0.044s p=0.772 n=12
Bind Time 0.012s (±14.09%) 0.013s (±10.71%) 🔻+0.002s (+13.48%) 0.011s 0.018s p=0.029 n=12
Check Time 0.504s (± 0.73%) 0.480s (± 0.47%) 🟩-0.024s (- 4.80%) 0.475s 0.485s p=0.000 n=12
Emit Time 0.270s (± 2.28%) 0.267s (± 2.25%) ~ 0.254s 0.292s p=0.297 n=12
Total Time 0.831s (± 0.84%) 0.807s (± 0.81%) -0.025s (- 2.99%) 0.788s 0.828s p=0.000 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 845,590 (± 0.05%) 632,761 (± 0.04%) 🟩-212,829 (-25.17%) 632,311 633,521 p=0.000 n=12
Types 248,126 (± 0.00%) 248,126 (± 0.00%) ~ 248,123 248,135 p=1.000 n=12
Memory Used 750,384k (± 0.02%) 537,054k (± 0.02%) 🟩-213,331k (-28.43%) 536,823k 537,268k p=0.000 n=12
Memory Allocs 12,917,874 (± 0.05%) 13,206,192 (± 0.03%) +288,317 (+ 2.23%) 13,200,348 13,223,873 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.257s (± 2.81%) 0.223s (± 3.12%) 🟩-0.034s (-13.34%) 0.207s 0.242s p=0.000 n=12
Bind Time 0.063s (±13.13%) 0.084s (±17.92%) 🔻+0.020s (+32.37%) 0.051s 0.116s p=0.011 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.556s (± 0.72%) 1.545s (± 1.60%) ~ 1.495s 1.617s p=0.272 n=12
Total Time 1.907s (± 0.89%) 1.882s (± 1.02%) -0.025s (- 1.31%) 1.820s 1.930s p=0.030 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,359,614 4,156,944 🟩-202,670 (- 4.65%) ~ ~ p=0.000 n=12
Types 1,376,379 1,376,379 ~ ~ ~ p=1.000 n=12
Memory Used 2,813,496k (± 0.04%) 2,164,084k (± 0.08%) 🟩-649,412k (-23.08%) 2,160,983k 2,168,961k p=0.000 n=12
Memory Allocs 32,823,862 (± 0.05%) 29,814,130 (± 0.07%) 🟩-3,009,732 (- 9.17%) 29,753,699 29,868,151 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.501s (± 3.50%) 0.468s (± 2.25%) 🟩-0.033s (- 6.58%) 0.439s 0.505s p=0.003 n=12
Bind Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Check Time 8.618s (± 0.62%) 9.113s (± 0.26%) 🔻+0.494s (+ 5.74%) 9.026s 9.147s p=0.000 n=12
Emit Time 0.468s (± 9.20%) 0.421s (± 0.34%) 🟩-0.047s (-10.12%) 0.416s 0.425s p=0.000 n=12
Total Time 10.374s (± 0.56%) 10.754s (± 0.36%) +0.381s (+ 3.67%) 10.623s 10.810s p=0.000 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,390,229 1,242,234 🟩-147,995 (-10.65%) ~ ~ p=0.000 n=12
Types 441,498 441,498 ~ ~ ~ p=1.000 n=12
Memory Used 1,626,894k (± 0.73%) 1,253,541k (± 0.62%) 🟩-373,354k (-22.95%) 1,238,150k 1,278,151k p=0.000 n=12
Memory Allocs 92,134,278 (± 0.19%) 87,969,162 (± 0.19%) 🟩-4,165,116 (- 4.52%) 87,657,809 88,476,369 p=0.000 n=12
Config Time 0.004s (±11.74%) 0.003s (±14.60%) ~ 0.002s 0.004s p=0.757 n=12
Parse Time 0.192s (± 3.21%) 0.189s (± 2.88%) ~ 0.173s 0.205s p=0.325 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.793s (± 0.60%) 1.782s (± 0.49%) ~ 1.766s 1.811s p=0.097 n=12
Emit Time 0.307s (± 3.74%) 0.316s (± 2.20%) ~ 0.301s 0.335s p=0.183 n=12
Total Time 23.487s (± 0.66%) 23.142s (± 0.52%) -0.346s (- 1.47%) 22.766s 23.378s p=0.003 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 334,953 285,011 🟩-49,942 (-14.91%) ~ ~ p=0.000 n=12
Types 197,616 197,616 ~ ~ ~ p=1.000 n=12
Memory Used 297,281k (± 0.02%) 227,231k (± 0.02%) 🟩-70,050k (-23.56%) 227,115k 227,359k p=0.000 n=12
Memory Allocs 4,620,901 (± 0.01%) 4,372,682 (± 0.00%) 🟩-248,219 (- 5.37%) 4,372,304 4,373,278 p=0.000 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.117s (± 5.05%) 0.113s (± 5.40%) ~ 0.103s 0.128s p=0.271 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.039s (± 0.49%) 1.020s (± 0.44%) -0.019s (- 1.84%) 1.011s 1.036s p=0.000 n=12
Emit Time 0.150s (± 5.28%) 0.146s (± 3.31%) ~ 0.136s 0.164s p=0.163 n=12
Total Time 1.357s (± 0.68%) 1.333s (± 0.87%) -0.024s (- 1.75%) 1.310s 1.375s p=0.003 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 303,834 256,365 🟩-47,469 (-15.62%) ~ ~ p=0.000 n=12
Types 181,663 181,663 ~ ~ ~ p=1.000 n=12
Memory Used 258,147k (± 0.02%) 196,654k (± 0.01%) 🟩-61,493k (-23.82%) 196,564k 196,709k p=0.000 n=12
Memory Allocs 1,613,609 (± 0.02%) 1,455,468 (± 0.02%) 🟩-158,141 (- 9.80%) 1,454,894 1,455,942 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.094s (± 4.31%) 0.099s (± 3.59%) ~ 0.092s 0.108s p=0.085 n=12
Bind Time 0.036s (±11.33%) 0.041s (± 8.81%) 🔻+0.005s (+13.75%) 0.032s 0.052s p=0.021 n=12
Check Time 0.814s (± 0.53%) 0.810s (± 0.98%) ~ 0.796s 0.832s p=0.385 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.958s (± 0.50%) 0.963s (± 0.71%) ~ 0.942s 0.983s p=0.155 n=12
vscode - native
Errors 395 395 ~ ~ ~ p=1.000 n=12
Symbols 11,378,289 8,350,812 🟩-3,027,477 (-26.61%) ~ ~ p=0.000 n=12
Types 3,767,672 3,767,672 ~ ~ ~ p=1.000 n=12
Memory Used 6,548,115k (± 0.03%) 4,477,944k (± 0.02%) 🟩-2,070,171k (-31.61%) 4,476,443k 4,481,745k p=0.000 n=12
Memory Allocs 55,630,881 (± 0.07%) 54,849,595 (± 0.07%) -781,286 (- 1.40%) 54,825,315 55,036,829 p=0.000 n=12
Config Time 0.075s (± 0.24%) 0.075s (± 0.43%) ~ 0.074s 0.076s p=1.000 n=12
Parse Time 1.855s (± 3.91%) 1.700s (± 2.76%) 🟩-0.155s (- 8.38%) 1.605s 1.849s p=0.002 n=12
Bind Time 0.613s (±20.64%) 0.599s (±13.76%) ~ 0.464s 0.814s p=0.542 n=12
Check Time 13.572s (± 1.30%) 12.893s (± 0.69%) 🟩-0.679s (- 5.00%) 12.730s 13.197s p=0.000 n=12
Emit Time 4.996s (±10.61%) 5.237s (± 4.54%) ~ 4.682s 5.767s p=0.514 n=12
Total Time 21.198s (± 2.03%) 20.590s (± 1.17%) -0.607s (- 2.87%) 20.058s 21.189s p=0.017 n=12
webpack - native
Errors 583 583 ~ ~ ~ p=1.000 n=12
Symbols 1,305,849 1,100,509 🟩-205,340 (-15.72%) ~ ~ p=0.000 n=12
Types 613,709 613,709 ~ ~ ~ p=1.000 n=12
Memory Used 936,877k (± 0.01%) 682,239k (± 0.03%) 🟩-254,638k (-27.18%) 681,802k 682,739k p=0.000 n=12
Memory Allocs 6,598,871 (± 0.05%) 6,248,169 (± 0.02%) 🟩-350,702 (- 5.31%) 6,246,284 6,250,676 p=0.000 n=12
Config Time 0.009s 0.009s ~ ~ ~ p=1.000 n=12
Parse Time 0.291s (± 2.51%) 0.288s (± 2.72%) ~ 0.264s 0.312s p=0.832 n=12
Bind Time 0.085s (±14.96%) 0.076s (±11.05%) ~ 0.066s 0.107s p=0.155 n=12
Check Time 1.776s (± 1.24%) 1.809s (± 0.86%) ~ 1.780s 1.857s p=0.068 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.198s (± 0.57%) 2.217s (± 0.88%) ~ 2.183s 2.261s p=0.086 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,061,928 815,636 🟩-246,292 (-23.19%) ~ ~ p=0.000 n=12
Types 389,645 389,645 ~ ~ ~ p=1.000 n=12
Memory Used 554,349k (± 0.02%) 392,565k (± 0.03%) 🟩-161,784k (-29.18%) 392,371k 393,002k p=0.000 n=12
Memory Allocs 4,885,785 (± 0.05%) 4,389,821 (± 0.07%) 🟩-495,964 (-10.15%) 4,383,552 4,400,452 p=0.000 n=12
Config Time 0.003s 0.003s ~ ~ ~ p=1.000 n=12
Parse Time 0.143s (± 3.19%) 0.138s (± 2.50%) ~ 0.132s 0.149s p=0.084 n=12
Bind Time 0.047s (±13.31%) 0.037s (± 5.93%) 🟩-0.010s (-21.28%) 0.034s 0.043s p=0.022 n=12
Check Time 1.126s (± 0.71%) 1.118s (± 0.91%) ~ 1.095s 1.145s p=0.235 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.331s (± 0.75%) 1.306s (± 0.51%) -0.026s (- 1.93%) 1.290s 1.322s p=0.000 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • strada-build-src - native
  • strada-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 12
Baseline baseline 12

Developer Information:

Download Benchmarks

@jakebailey

Copy link
Copy Markdown
Member Author

TypeScript Bot (@typescript-bot) perf test this faster

@typescript-automation

typescript-automation Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this faster ✅ Started 👀 Results

@typescript-automation

Copy link
Copy Markdown
Contributor

Jake Bailey (@jakebailey)
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-Unions - native
Errors 41 41 ~ ~ ~ p=1.000 n=12
Symbols 115,276 94,933 🟩-20,343 (-17.65%) ~ ~ p=0.000 n=12
Types 79,613 79,613 ~ ~ ~ p=1.000 n=12
Memory Used 133,868k (± 0.05%) 101,569k (± 0.07%) 🟩-32,299k (-24.13%) 101,453k 101,736k p=0.000 n=12
Memory Allocs 2,190,049 (± 0.01%) 2,217,166 (± 0.01%) +27,117 (+ 1.24%) 2,216,840 2,217,626 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.040s (± 5.07%) 0.040s (± 4.63%) ~ 0.035s 0.044s p=0.431 n=12
Bind Time 0.013s (±13.69%) 0.015s (± 6.69%) ~ 0.012s 0.017s p=0.065 n=12
Check Time 0.498s (± 0.67%) 0.475s (± 0.68%) 🟩-0.023s (- 4.55%) 0.468s 0.483s p=0.000 n=12
Emit Time 0.268s (± 1.94%) 0.270s (± 2.18%) ~ 0.254s 0.286s p=0.681 n=12
Total Time 0.825s (± 0.77%) 0.805s (± 0.99%) -0.020s (- 2.38%) 0.786s 0.830s p=0.001 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 845,646 (± 0.08%) 632,900 (± 0.02%) 🟩-212,746 (-25.16%) 632,676 633,263 p=0.000 n=12
Types 248,123 (± 0.00%) 248,124 (± 0.00%) ~ 248,122 248,125 p=0.741 n=12
Memory Used 750,418k (± 0.01%) 536,823k (± 0.01%) 🟩-213,595k (-28.46%) 536,586k 537,047k p=0.000 n=12
Memory Allocs 12,925,237 (± 0.11%) 13,177,609 (± 0.01%) +252,372 (+ 1.95%) 13,174,776 13,181,575 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.261s (± 2.49%) 0.219s (± 1.98%) 🟩-0.042s (-16.06%) 0.211s 0.232s p=0.000 n=12
Bind Time 0.062s (± 9.82%) 0.084s (±13.64%) 🔻+0.023s (+37.26%) 0.059s 0.110s p=0.000 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.555s (± 0.92%) 1.543s (± 1.85%) ~ 1.466s 1.621s p=0.369 n=12
Total Time 1.907s (± 1.00%) 1.878s (± 1.48%) ~ 1.787s 1.951s p=0.091 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,359,614 4,156,944 🟩-202,670 (- 4.65%) ~ ~ p=0.000 n=12
Types 1,376,379 1,376,379 ~ ~ ~ p=1.000 n=12
Memory Used 2,812,061k (± 0.04%) 1,963,390k (± 0.05%) 🟩-848,671k (-30.18%) 1,960,352k 1,966,087k p=0.000 n=12
Memory Allocs 32,815,350 (± 0.05%) 27,853,955 (± 0.05%) 🟩-4,961,396 (-15.12%) 27,821,139 27,896,807 p=0.000 n=12
Config Time 0.017s 0.017s ~ ~ ~ p=1.000 n=12
Parse Time 0.502s (± 1.63%) 0.475s (± 2.44%) 🟩-0.026s (- 5.25%) 0.438s 0.500s p=0.000 n=12
Bind Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Check Time 8.666s (± 0.28%) 7.915s (± 0.37%) 🟩-0.751s (- 8.67%) 7.854s 7.993s p=0.000 n=12
Emit Time 0.461s (± 6.68%) 0.485s (± 7.43%) ~ 0.424s 0.601s p=0.325 n=12
Total Time 10.423s (± 0.35%) 9.640s (± 0.38%) 🟩-0.783s (- 7.51%) 9.518s 9.715s p=0.000 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,390,229 1,242,234 🟩-147,995 (-10.65%) ~ ~ p=0.000 n=12
Types 441,498 441,498 ~ ~ ~ p=1.000 n=12
Memory Used 1,628,857k (± 0.76%) 1,256,565k (± 0.79%) 🟩-372,292k (-22.86%) 1,236,822k 1,282,283k p=0.000 n=12
Memory Allocs 92,044,442 (± 0.16%) 87,144,263 (± 0.18%) 🟩-4,900,180 (- 5.32%) 86,681,101 87,475,446 p=0.000 n=12
Config Time 0.003s (±23.23%) 0.004s (±11.74%) ~ 0.003s 0.005s p=0.303 n=12
Parse Time 0.193s (± 3.31%) 0.194s (± 3.09%) ~ 0.182s 0.212s p=0.810 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.803s (± 0.56%) 1.770s (± 0.64%) -0.033s (- 1.81%) 1.746s 1.802s p=0.000 n=12
Emit Time 0.307s (± 4.46%) 0.322s (± 4.17%) ~ 0.287s 0.354s p=0.066 n=12
Total Time 23.442s (± 0.61%) 23.066s (± 0.58%) -0.376s (- 1.60%) 22.658s 23.344s p=0.001 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 334,953 285,011 🟩-49,942 (-14.91%) ~ ~ p=0.000 n=12
Types 197,616 197,616 ~ ~ ~ p=1.000 n=12
Memory Used 297,287k (± 0.03%) 225,911k (± 0.02%) 🟩-71,376k (-24.01%) 225,756k 226,046k p=0.000 n=12
Memory Allocs 4,620,545 (± 0.01%) 4,320,055 (± 0.01%) 🟩-300,491 (- 6.50%) 4,318,803 4,321,061 p=0.000 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.110s (± 2.67%) 0.113s (± 6.11%) ~ 0.097s 0.131s p=0.618 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.039s (± 0.39%) 1.007s (± 0.61%) 🟩-0.032s (- 3.05%) 0.999s 1.032s p=0.000 n=12
Emit Time 0.144s (± 3.77%) 0.142s (± 4.24%) ~ 0.121s 0.159s p=0.467 n=12
Total Time 1.341s (± 0.66%) 1.317s (± 0.93%) -0.024s (- 1.81%) 1.284s 1.349s p=0.005 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 303,834 256,365 🟩-47,469 (-15.62%) ~ ~ p=0.000 n=12
Types 181,663 181,663 ~ ~ ~ p=1.000 n=12
Memory Used 258,128k (± 0.02%) 195,835k (± 0.01%) 🟩-62,293k (-24.13%) 195,762k 195,916k p=0.000 n=12
Memory Allocs 1,613,861 (± 0.01%) 1,427,612 (± 0.01%) 🟩-186,250 (-11.54%) 1,427,319 1,428,101 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.098s (± 3.66%) 0.099s (± 5.33%) ~ 0.087s 0.115s p=0.787 n=12
Bind Time 0.038s (±11.42%) 0.041s (± 6.18%) ~ 0.034s 0.047s p=0.235 n=12
Check Time 0.816s (± 0.75%) 0.802s (± 0.73%) -0.014s (- 1.75%) 0.788s 0.817s p=0.005 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.966s (± 0.76%) 0.956s (± 0.72%) ~ 0.936s 0.974s p=0.066 n=12
vscode - native
Errors 395 395 ~ ~ ~ p=1.000 n=12
Symbols 11,346,995 8,323,702 🟩-3,023,293 (-26.64%) ~ ~ p=0.000 n=12
Types 3,762,529 3,762,529 ~ ~ ~ p=1.000 n=12
Memory Used 6,544,236k (± 0.02%) 4,472,338k (± 0.03%) 🟩-2,071,898k (-31.66%) 4,469,583k 4,477,074k p=0.000 n=12
Memory Allocs 55,570,960 (± 0.03%) 54,633,527 (± 0.03%) -937,434 (- 1.69%) 54,612,658 54,713,726 p=0.000 n=12
Config Time 0.075s (± 0.41%) 0.075s (± 0.54%) ~ 0.074s 0.076s p=1.000 n=12
Parse Time 1.867s (± 3.12%) 1.711s (± 2.26%) 🟩-0.155s (- 8.33%) 1.619s 1.786s p=0.000 n=12
Bind Time 0.542s (±13.98%) 0.567s (±13.06%) ~ 0.465s 0.793s p=0.203 n=12
Check Time 13.465s (± 0.99%) 12.710s (± 0.82%) 🟩-0.756s (- 5.61%) 12.456s 12.908s p=0.000 n=12
Emit Time 4.794s (±10.45%) 5.168s (± 6.77%) ~ 4.257s 5.777s p=0.259 n=12
Total Time 20.830s (± 1.92%) 20.315s (± 1.52%) ~ 19.555s 20.945s p=0.114 n=12
webpack - native
Errors 584 584 ~ ~ ~ p=1.000 n=12
Symbols 1,320,229 1,113,974 🟩-206,255 (-15.62%) ~ ~ p=0.000 n=12
Types 625,283 625,283 ~ ~ ~ p=1.000 n=12
Memory Used 952,980k (± 0.02%) 688,662k (± 0.02%) 🟩-264,318k (-27.74%) 688,209k 688,988k p=0.000 n=12
Memory Allocs 6,695,417 (± 0.01%) 6,200,080 (± 0.05%) 🟩-495,337 (- 7.40%) 6,197,454 6,214,145 p=0.000 n=12
Config Time 0.009s 0.009s (± 4.23%) ~ 0.009s 0.011s p=0.478 n=12
Parse Time 0.299s (± 2.90%) 0.292s (± 2.27%) ~ 0.269s 0.307s p=0.213 n=12
Bind Time 0.083s (±19.79%) 0.071s (± 3.24%) ~ 0.067s 0.079s p=0.502 n=12
Check Time 2.159s (± 0.92%) 2.148s (± 0.23%) ~ 2.134s 2.167s p=0.504 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.584s (± 0.52%) 2.553s (± 0.38%) -0.031s (- 1.19%) 2.531s 2.584s p=0.001 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,061,928 815,636 🟩-246,292 (-23.19%) ~ ~ p=0.000 n=12
Types 389,645 389,645 ~ ~ ~ p=1.000 n=12
Memory Used 554,290k (± 0.02%) 389,215k (± 0.04%) 🟩-165,075k (-29.78%) 388,945k 389,763k p=0.000 n=12
Memory Allocs 4,884,902 (± 0.10%) 4,307,981 (± 0.07%) 🟩-576,921 (-11.81%) 4,300,464 4,317,948 p=0.000 n=12
Config Time 0.003s 0.003s (± 6.23%) ~ 0.002s 0.003s p=1.000 n=12
Parse Time 0.148s (± 4.25%) 0.137s (± 3.53%) 🟩-0.012s (- 7.81%) 0.127s 0.154s p=0.006 n=12
Bind Time 0.045s (±16.86%) 0.043s (±14.02%) ~ 0.034s 0.060s p=0.831 n=12
Check Time 1.129s (± 0.39%) 1.104s (± 0.89%) -0.025s (- 2.24%) 1.077s 1.127s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.336s (± 0.72%) 1.294s (± 0.92%) 🟩-0.042s (- 3.13%) 1.263s 1.317s p=0.000 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • strada-build-src - native
  • strada-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 12
Baseline baseline 12

Developer Information:

Download Benchmarks

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The broad unsafe layout and memory-lifetime refactor warrants final human validation despite extensive tests.

0 open findings

What changed in this PR

Optimizes memory usage across the native Go compiler while preserving compiler and language-service behavior.

Changes:

  • Replaces interface-backed AST, type, and mapper payloads with compact tagged layouts.
  • Adds arenas, pointer-free indexes, lazy metadata, and reusable checker workspaces.
  • Adds regression tests, benchmarks, and compiler baselines.
File Description
tsc/​testdata/​tests/​cases/​compiler/​instantiatedReferenceMemberResolution.ts Adds member-resolution regression coverage.
tsc/​testdata/​baselines/​reference/​compiler/​instantiatedReferenceMemberResolution.types Records inferred types.
tsc/​testdata/​baselines/​reference/​compiler/​instantiatedReferenceMemberResolution.symbols Records resolved symbols.
tsc/​testdata/​baselines/​reference/​compiler/​instantiatedReferenceMemberResolution.js Records emit and declarations.
tsc/​testdata/​baselines/​reference/​compiler/​instantiatedReferenceMemberResolution.errors.txt Records expected diagnostics.
tsc/​internal/​fourslash/​tests/​completionListForGenericInstance1_test.go Tests generic completion stability.
tsc/​internal/​core/​linkstore.go Compresses paged link storage.
tsc/​internal/​core/​linkstore_test.go Tests and benchmarks arenas/link stores.
tsc/​internal/​core/​arena.go Bounds arena chunks and adds indexed arenas.
tsc/​internal/​checker/​utilities.go Adds reusable checker workspaces.
tsc/​internal/​checker/​types.go Compacts checker types and metadata.
tsc/​internal/​checker/​types_test.go Tests layouts, caches, and allocation behavior.
tsc/​internal/​checker/​tracer.go Updates tracing for tagged types.
tsc/​internal/​checker/​services.go Uses compact member and metadata accessors.
tsc/​internal/​checker/​relater.go Compresses relation caches and signature access.
tsc/​internal/​checker/​pseudotypenodebuilder.go Uses compact signature accessors.
tsc/​internal/​checker/​nodecopy.go Updates signature type-parameter access.
tsc/​internal/​checker/​nodebuilderscopes.go Updates signature scope handling.
tsc/​internal/​checker/​nodebuilderimpl.go Adapts node building to compact metadata.
tsc/​internal/​checker/​mapper.go Replaces mapper interfaces with tagged dispatch.
tsc/​internal/​checker/​jsx.go Uses optional composite signature metadata.
tsc/​internal/​checker/​inference.go Embeds inference mapper storage.
tsc/​internal/​checker/​flow.go Uses compact signature accessors.
tsc/​internal/​checker/​exports.go Updates symbol metadata access.
tsc/​internal/​checker/​checker_test.go Adds member-resolution tests and benchmarks.
tsc/​internal/​binder/​binder.go Allocates optional symbol metadata in arenas.
tsc/​internal/​ast/​utilities.go Updates member/export initialization APIs.
tsc/​internal/​ast/​symbol.go Moves optional symbol fields out of hot records.
tsc/​internal/​ast/​symbol_test.go Tests compact symbol storage and lifetime.
tsc/​internal/​ast/​nodeaccessors_test.go Tests kind-dispatched AST accessors.
tsc/​internal/​ast/​nodeaccessors_bench_test.go Benchmarks AST accessor dispatch.
tsc/​internal/​ast/​kind_stringer_generated.go Includes synthetic flow-node kinds.
tsc/​internal/​ast/​flow.go Tags synthetic flow-node payloads.
tsc/​internal/​ast/​ast.go Removes AST payload interfaces.
tools/​scripts/​tsc/​generate-go-ast.ts Generates compact kind-based AST dispatch.
Files not reviewed (1)
  • tsc/internal/ast/kind_stringer_generated.go: Generated file

🧠 Review effort: Balanced


💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

@jakebailey

Copy link
Copy Markdown
Member Author

Ripped #64735 out for now. This still includes #64063.

TypeScript Bot (@typescript-bot) perf test this faster

@typescript-automation

typescript-automation Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this faster ✅ Started 👀 Results

@typescript-automation

Copy link
Copy Markdown
Contributor

Jake Bailey (@jakebailey)
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-Unions - native
Errors 41 41 ~ ~ ~ p=1.000 n=12
Symbols 115,276 115,276 ~ ~ ~ p=1.000 n=12
Types 79,613 79,613 ~ ~ ~ p=1.000 n=12
Memory Used 133,237k (± 0.04%) 102,799k (± 0.06%) 🟩-30,438k (-22.85%) 102,703k 102,976k p=0.000 n=12
Memory Allocs 2,190,292 (± 0.01%) 2,198,415 (± 0.00%) +8,123 (+ 0.37%) 2,198,215 2,198,730 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.040s (± 3.88%) 0.039s (± 3.07%) ~ 0.036s 0.042s p=0.639 n=12
Bind Time 0.012s (±11.20%) 0.015s (± 7.64%) 🔻+0.003s (+24.83%) 0.012s 0.018s p=0.002 n=12
Check Time 0.499s (± 0.67%) 0.479s (± 0.68%) 🟩-0.020s (- 4.01%) 0.472s 0.489s p=0.000 n=12
Emit Time 0.277s (± 2.19%) 0.270s (± 1.31%) -0.007s (- 2.49%) 0.262s 0.283s p=0.049 n=12
Total Time 0.835s (± 0.81%) 0.810s (± 0.66%) -0.025s (- 2.97%) 0.796s 0.829s p=0.000 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 845,242 (± 0.11%) 845,124 (± 0.06%) ~ 843,863 846,437 p=0.551 n=12
Types 248,124 (± 0.00%) 248,124 (± 0.00%) ~ 248,122 248,127 p=0.452 n=12
Memory Used 746,093k (± 0.02%) 552,834k (± 0.02%) 🟩-193,259k (-25.90%) 552,598k 553,084k p=0.000 n=12
Memory Allocs 12,920,897 (± 0.08%) 13,081,363 (± 0.01%) +160,465 (+ 1.24%) 13,078,812 13,087,281 p=0.000 n=12
Config Time 0.020s (± 1.60%) 0.020s (± 0.90%) ~ 0.020s 0.021s p=0.069 n=12
Parse Time 0.328s (± 1.96%) 0.284s (± 2.83%) 🟩-0.044s (-13.52%) 0.268s 0.306s p=0.000 n=12
Bind Time 0.072s (± 1.34%) 0.090s (±10.88%) 🔻+0.018s (+25.29%) 0.075s 0.114s p=0.000 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.861s (± 0.99%) 1.901s (± 1.61%) +0.040s (+ 2.12%) 1.824s 1.968s p=0.037 n=12
Total Time 2.296s (± 0.81%) 2.315s (± 1.35%) ~ 2.230s 2.388s p=0.192 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,339,337 4,339,337 ~ ~ ~ p=1.000 n=12
Types 1,379,387 1,379,387 ~ ~ ~ p=1.000 n=12
Memory Used 2,774,696k (± 0.05%) 1,951,648k (± 0.05%) 🟩-823,049k (-29.66%) 1,948,139k 1,953,815k p=0.000 n=12
Memory Allocs 32,721,586 (± 0.07%) 27,296,350 (± 0.07%) 🟩-5,425,236 (-16.58%) 27,256,360 27,348,724 p=0.000 n=12
Config Time 0.017s 0.017s (± 1.07%) ~ 0.016s 0.017s p=1.000 n=12
Parse Time 0.497s (± 3.36%) 0.465s (± 3.67%) 🟩-0.033s (- 6.60%) 0.414s 0.498s p=0.007 n=12
Bind Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Check Time 8.871s (± 0.49%) 7.908s (± 0.44%) 🟩-0.963s (-10.86%) 7.821s 8.017s p=0.000 n=12
Emit Time 0.421s (± 0.75%) 0.444s (± 5.84%) 🔻+0.023s (+ 5.45%) 0.421s 0.527s p=0.001 n=12
Total Time 10.574s (± 0.51%) 9.580s (± 0.27%) 🟩-0.993s (- 9.39%) 9.520s 9.662s p=0.000 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,388,669 1,388,669 ~ ~ ~ p=1.000 n=12
Types 441,862 441,862 ~ ~ ~ p=1.000 n=12
Memory Used 1,628,939k (± 0.84%) 1,268,198k (± 0.75%) 🟩-360,741k (-22.15%) 1,245,065k 1,302,483k p=0.000 n=12
Memory Allocs 92,200,976 (± 0.17%) 86,513,256 (± 0.17%) 🟩-5,687,720 (- 6.17%) 85,968,706 86,847,914 p=0.000 n=12
Config Time 0.003s (±12.31%) 0.004s (±12.12%) ~ 0.002s 0.004s p=0.893 n=12
Parse Time 0.194s (± 5.11%) 0.190s (± 2.51%) ~ 0.177s 0.200s p=0.799 n=12
Bind Time 0.000s (±217.90%) 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.818s (± 0.58%) 1.775s (± 0.64%) -0.043s (- 2.36%) 1.748s 1.807s p=0.000 n=12
Emit Time 0.313s (± 4.90%) 0.323s (± 4.48%) ~ 0.285s 0.350s p=0.325 n=12
Total Time 23.553s (± 0.56%) 23.155s (± 0.76%) -0.398s (- 1.69%) 22.650s 23.657s p=0.001 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 334,953 334,953 ~ ~ ~ p=1.000 n=12
Types 197,616 197,616 ~ ~ ~ p=1.000 n=12
Memory Used 296,057k (± 0.03%) 229,435k (± 0.02%) 🟩-66,622k (-22.50%) 229,357k 229,554k p=0.000 n=12
Memory Allocs 4,621,528 (± 0.01%) 4,284,288 (± 0.01%) 🟩-337,240 (- 7.30%) 4,283,283 4,285,080 p=0.000 n=12
Config Time 0.001s (±19.81%) 0.000s (±146.91%) 🟩-0.001s (-81.82%) 0.000s 0.001s p=0.001 n=12
Parse Time 0.089s (± 4.85%) 0.096s (± 3.75%) 🔻+0.008s (+ 8.64%) 0.080s 0.101s p=0.007 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 0.864s (± 0.55%) 0.850s (± 0.67%) -0.014s (- 1.62%) 0.838s 0.863s p=0.000 n=12
Emit Time 0.119s (±10.42%) 0.114s (± 4.59%) ~ 0.102s 0.131s p=0.054 n=12
Total Time 1.120s (± 0.83%) 1.105s (± 0.86%) -0.015s (- 1.38%) 1.081s 1.132s p=0.021 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 303,834 303,834 ~ ~ ~ p=1.000 n=12
Types 181,663 181,663 ~ ~ ~ p=1.000 n=12
Memory Used 256,627k (± 0.02%) 198,510k (± 0.01%) 🟩-58,117k (-22.65%) 198,432k 198,569k p=0.000 n=12
Memory Allocs 1,614,052 (± 0.01%) 1,386,150 (± 0.02%) 🟩-227,902 (-14.12%) 1,385,755 1,387,001 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.099s (± 4.49%) 0.097s (± 4.39%) ~ 0.088s 0.108s p=0.368 n=12
Bind Time 0.040s (±11.11%) 0.040s (± 6.04%) ~ 0.035s 0.048s p=0.898 n=12
Check Time 0.816s (± 0.90%) 0.817s (± 0.61%) ~ 0.803s 0.830s p=0.522 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.969s (± 0.89%) 0.967s (± 0.69%) ~ 0.947s 0.981s p=0.788 n=12
vscode - native
Errors 396 396 ~ ~ ~ p=1.000 n=12
Symbols 11,348,832 11,348,832 ~ ~ ~ p=1.000 n=12
Types 3,744,021 3,744,021 ~ ~ ~ p=1.000 n=12
Memory Used 6,462,500k (± 0.01%) 4,705,304k (± 0.02%) 🟩-1,757,196k (-27.19%) 4,703,453k 4,710,028k p=0.000 n=12
Memory Allocs 55,478,541 (± 0.02%) 53,488,848 (± 0.02%) 🟩-1,989,693 (- 3.59%) 53,477,113 53,542,988 p=0.000 n=12
Config Time 0.075s (± 0.24%) 0.075s (± 0.41%) ~ 0.074s 0.075s p=0.317 n=12
Parse Time 1.748s (± 2.75%) 1.684s (± 2.34%) 🟩-0.064s (- 3.64%) 1.612s 1.803s p=0.046 n=12
Bind Time 0.720s (±16.86%) 0.644s (±14.84%) ~ 0.457s 0.841s p=0.325 n=12
Check Time 14.917s (± 0.88%) 14.488s (± 0.85%) -0.429s (- 2.88%) 14.290s 14.803s p=0.000 n=12
Emit Time 5.273s (± 9.44%) 5.151s (± 4.84%) ~ 4.209s 5.700s p=0.443 n=12
Total Time 22.821s (± 2.02%) 22.123s (± 1.15%) ~ 21.217s 22.562s p=0.052 n=12
webpack - native
Errors 585 585 ~ ~ ~ p=1.000 n=12
Symbols 1,316,105 1,316,105 ~ ~ ~ p=1.000 n=12
Types 617,840 617,840 ~ ~ ~ p=1.000 n=12
Memory Used 947,852k (± 0.02%) 704,713k (± 0.02%) 🟩-243,139k (-25.65%) 704,362k 705,037k p=0.000 n=12
Memory Allocs 6,673,137 (± 0.02%) 5,986,383 (± 0.02%) 🟩-686,754 (-10.29%) 5,983,639 5,991,416 p=0.000 n=12
Config Time 0.009s 0.009s (± 3.96%) ~ 0.009s 0.011s p=1.000 n=12
Parse Time 0.291s (± 3.90%) 0.297s (± 2.67%) ~ 0.277s 0.320s p=0.451 n=12
Bind Time 0.093s (±21.01%) 0.071s (± 2.10%) ~ 0.068s 0.075s p=0.270 n=12
Check Time 2.216s (± 0.58%) 2.288s (± 2.80%) +0.072s (+ 3.25%) 2.232s 2.547s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.644s (± 0.37%) 2.700s (± 2.63%) ~ 2.631s 2.989s p=0.183 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,065,632 1,065,632 ~ ~ ~ p=1.000 n=12
Types 390,378 390,378 ~ ~ ~ p=1.000 n=12
Memory Used 548,183k (± 0.01%) 405,019k (± 0.03%) 🟩-143,164k (-26.12%) 404,804k 405,382k p=0.000 n=12
Memory Allocs 4,889,311 (± 0.08%) 4,106,501 (± 0.11%) 🟩-782,810 (-16.01%) 4,094,696 4,122,225 p=0.000 n=12
Config Time 0.003s 0.003s (± 8.64%) ~ 0.002s 0.003s p=0.478 n=12
Parse Time 0.142s (± 2.70%) 0.135s (± 3.15%) 🟩-0.007s (- 4.99%) 0.125s 0.147s p=0.019 n=12
Bind Time 0.050s (±16.27%) 0.045s (±15.31%) ~ 0.034s 0.065s p=0.522 n=12
Check Time 1.144s (± 0.41%) 1.125s (± 1.02%) -0.018s (- 1.62%) 1.108s 1.155s p=0.021 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.348s (± 0.60%) 1.316s (± 0.88%) -0.032s (- 2.39%) 1.287s 1.345s p=0.000 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • strada-build-src - native
  • strada-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 12
Baseline baseline 12

Developer Information:

Download Benchmarks

@jakebailey
Jake Bailey (jakebailey) marked this pull request as ready for review October 13, 2026 10:34
Most resolved type nodes never need an anonymous object's outer type
parameter list. Reserving a slice header for every node makes the common
case needlessly expensive to retain and scan.

TypeNodeLinks now occupies 16 rather than 32 bytes on amd64. An optional
checker-owned arena entry preserves computed-empty lists and the
original slice aliasing without introducing a separate allocation per
cached list.

VS Code src/tsconfig.json versus the parent commit, six fresh-process
interleaved pairs with the normal GC policy. Retained bytes fall 0.43%,
scan bytes 0.47%, and allocated bytes 0.33%. Allocation events and
instruction counts are not statistically different; no CPU improvement
is claimed.

Exact production diagnostics and semantic counts match.

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-typeparams-before.txt │       vscode-typeparams.txt        │
                   │          retained-B          │  retained-B   vs base              │
ExternalProgram-20                   3.864Gi ± 0%   3.847Gi ± 0%  -0.43% (p=0.002 n=6)

                   │ vscode-typeparams-before.txt │       vscode-typeparams.txt        │
                   │            scan-B            │    scan-B     vs base              │
ExternalProgram-20                   3.459Gi ± 0%   3.443Gi ± 0%  -0.47% (p=0.002 n=6)

                   │ vscode-typeparams-before.txt │       vscode-typeparams.txt        │
                   │             B/op             │     B/op      vs base              │
ExternalProgram-20                   5.484Gi ± 0%   5.466Gi ± 0%  -0.33% (p=0.002 n=6)

                   │ vscode-typeparams-before.txt │    vscode-typeparams.txt     │
                   │          allocs/op           │  allocs/op   vs base         │
ExternalProgram-20                    27.38M ± 0%   27.35M ± 0%  ~ (p=0.093 n=6)

                        │ typeparams-before-instructions.txt │   typeparams-instructions.txt    │
                        │          instructions/op           │ instructions/op  vs base         │
ExternalInstructions-20                          297.2G ± 2%       290.9G ± 4%  ~ (p=0.310 n=6)
Most signatures have no type parameters, explicit this parameter,
predicate, composite constituents, or isolated-type cache. Reserving
this state for every instantiated signature wastes memory and GC
scanning. Negative predicate results need no pointer at all.

Signature shrinks from 128 to 80 bytes on amd64. Checker-owned cold
storage preserves slice aliasing and independent clone caches; a
private, non-propagating flag retains the recursive no-predicate guard.

A full VS Code field census found 648637 signatures and only 84956
requiring cold storage (13.1%). Six fresh-process interleaved
comparisons against the parent commit, with normal GC, save 0.65%
retained bytes, 0.73% scan bytes, and 0.49% allocated bytes. Allocation
events and instructions are not statistically different. This is
incremental, not a CPU breakthrough.

Production diagnostics and semantic counts match exactly.

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-signature-before.txt │        vscode-signature.txt        │
                   │         retained-B          │  retained-B   vs base              │
ExternalProgram-20                  3.848Gi ± 0%   3.823Gi ± 0%  -0.65% (p=0.002 n=6)

                   │ vscode-signature-before.txt │        vscode-signature.txt        │
                   │           scan-B            │    scan-B     vs base              │
ExternalProgram-20                  3.443Gi ± 0%   3.418Gi ± 0%  -0.73% (p=0.002 n=6)

                   │ vscode-signature-before.txt │        vscode-signature.txt        │
                   │            B/op             │     B/op      vs base              │
ExternalProgram-20                  5.468Gi ± 0%   5.441Gi ± 0%  -0.49% (p=0.002 n=6)

                   │ vscode-signature-before.txt │     vscode-signature.txt     │
                   │          allocs/op          │  allocs/op   vs base         │
ExternalProgram-20                   27.36M ± 0%   27.36M ± 0%  ~ (p=0.589 n=6)

                        │ signature-before-instructions.txt │    signature-instructions.txt    │
                        │          instructions/op          │ instructions/op  vs base         │
ExternalInstructions-20                         297.9G ± 3%       296.1G ± 3%  ~ (p=0.699 n=6)
A live pointer into an arena chunk retains the entire backing
allocation, including unused capacity and unrelated dead values.
Resetting typed parser and binder arenas at every file multiplies
terminal chunk slack. Uniform 256-object chunks are especially wasteful
for large records.

Target 512 bytes per chunk before allocator rounding, preserving stable
direct pointers and exact-capacity slices. Larger contiguous slices keep
their separate allocation path. No GC settings, cross-file pooling, or
pointer decoding are introduced.

Six fresh-process interleaved VS Code comparisons against the parent
commit, using normal GC, reduce retained bytes 8.54%, scan bytes 10.44%,
allocated bytes 5.74%, and whole-process instructions 9.43%. Allocation
events rise 13.91%; wall time is inconclusive on the shared machine
(p=0.937).

Four-object chunks saved slightly more heap but raised allocation events
32.15%. A 512-byte target keeps most of the memory savings with less
than half that allocation penalty. Reusing partial parser and binder
chunks also saved memory but would couple otherwise independent file
lifetimes.

The retention regression fails with the old allocator. Mixed singleton,
slice, clone, growth, zero-size, and GC cases preserve addresses and
data. Production diagnostics and file, line, identifier, symbol, type,
and instantiation counts match exactly.

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-arena-before.txt │          vscode-arena.txt          │
                   │       retained-B        │  retained-B   vs base              │
ExternalProgram-20              3.823Gi ± 0%   3.497Gi ± 0%  -8.54% (p=0.002 n=6)

                   │ vscode-arena-before.txt │          vscode-arena.txt           │
                   │         scan-B          │    scan-B     vs base               │
ExternalProgram-20              3.418Gi ± 0%   3.062Gi ± 0%  -10.44% (p=0.002 n=6)

                   │ vscode-arena-before.txt │          vscode-arena.txt          │
                   │          B/op           │     B/op      vs base              │
ExternalProgram-20              5.442Gi ± 0%   5.130Gi ± 0%  -5.74% (p=0.002 n=6)

                   │ vscode-arena-before.txt │          vscode-arena.txt          │
                   │        allocs/op        │  allocs/op   vs base               │
ExternalProgram-20               27.36M ± 0%   31.17M ± 0%  +13.91% (p=0.002 n=6)

                        │ arena-before-instructions.txt │        arena-instructions.txt         │
                        │        instructions/op        │ instructions/op  vs base              │
ExternalInstructions-20                     300.8G ± 3%       272.5G ± 6%  -9.43% (p=0.002 n=6)
Resolved type nodes and signatures still kept AST pointers as map keys
despite already having stable node identities. Those maps add redundant
pointer storage, GC scanning, hashing, and growth allocations.

Reuse the existing node-link store's pointer-free paged indexes for
these two high-volume caches. Ordinary IDs and IDs outside the dense
reserved range retain the existing fallback, and caches stay
checker-local.

Six fresh-process interleaved VS Code comparisons against the parent
commit, using normal GC, reduce retained heap 1.20%, scan bytes 2.12%,
allocated bytes 2.11%, and allocation events 0.20%. Instructions are
inconclusive. This saves another roughly 43 MiB of heap and 66 MiB of
scanning.

Production diagnostics and semantic counts match exactly. Tests cover
cache identity, ordinary/reserved IDs, clone isolation, growth,
GC reachability, and independent checkers.

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-paged-before-6.txt │         vscode-paged-6.txt         │
                   │        retained-B         │  retained-B   vs base              │
ExternalProgram-20                3.497Gi ± 0%   3.455Gi ± 0%  -1.20% (p=0.002 n=6)

                   │ vscode-paged-before-6.txt │         vscode-paged-6.txt         │
                   │          scan-B           │    scan-B     vs base              │
ExternalProgram-20                3.061Gi ± 0%   2.997Gi ± 0%  -2.12% (p=0.002 n=6)

                   │ vscode-paged-before-6.txt │         vscode-paged-6.txt         │
                   │           B/op            │     B/op      vs base              │
ExternalProgram-20                5.129Gi ± 0%   5.021Gi ± 0%  -2.11% (p=0.002 n=6)

                   │ vscode-paged-before-6.txt │        vscode-paged-6.txt         │
                   │         allocs/op         │  allocs/op   vs base              │
ExternalProgram-20                 31.16M ± 0%   31.09M ± 0%  -0.20% (p=0.002 n=6)

                        │ paged-before-instructions.txt │      paged-instructions.txt      │
                        │        instructions/op        │ instructions/op  vs base         │
ExternalInstructions-20                     279.8G ± 5%       270.5G ± 2%  ~ (p=0.589 n=6)
Intersection reduction repeatedly allocates temporary property-count
tables. On MUI, this one allocation site accounts for roughly a quarter
of all allocated bytes, despite none of the tables needing to survive
the reduction. Reusing this workspace removes substantial allocation
churn without changing the first-seen property order or caching results.

Each recursive reduction borrows an independent checker-local table.
Returning a table clears its names and counts, including on early
returns; tables exceeding 4096 properties are not retained.

Against the parent commit, six fresh-process MUI single-checker pairs
save 1.36 GiB of allocation per run, reduce allocation events by 7.59%,
and reduce instructions by 6.02%. Default-threaded production MUI
instructions decrease 8.88%. Retained heap and scannable heap are
essentially unchanged: this is an allocation-churn optimization.

VS Code allocation savings are smaller. Production VS Code instructions
remain inconclusive after twelve pairs, with a higher point estimate;
Webpack instructions are also inconclusive. Wall times are noisy on
this shared host. All production diagnostic text and semantic counts
match between revisions.

The regression test allocated 21 times per warmed reduction before this
change and now allocates zero times. Tests also cover nested borrowing,
property order, clearing, oversized tables, and early-return cleanup.

Six fresh-process single-checker pairs, ordinary GC:
                  │ mui-property-counts-memory-before.txt │ mui-property-counts-memory-after.txt │
                  │              retained-B               │     retained-B       vs base         │
ExternalMemory-20                            1.492Gi ± 0%          1.492Gi ± 0%  ~ (p=0.310 n=6)

                  │ mui-property-counts-memory-before.txt │ mui-property-counts-memory-after.txt │
                  │                scan-B                 │       scan-B         vs base         │
ExternalMemory-20                            1.270Gi ± 0%          1.270Gi ± 0%  ~ (p=0.310 n=6)

                  │ mui-property-counts-memory-before.txt │ mui-property-counts-memory-after.txt │
                  │                 B/op                  │     B/op       vs base               │
ExternalMemory-20                            5.122Gi ± 0%    3.757Gi ± 0%  -26.64% (p=0.002 n=6)

                  │ mui-property-counts-memory-before.txt │ mui-property-counts-memory-after.txt │
                  │               allocs/op               │   allocs/op     vs base              │
ExternalMemory-20                             24.77M ± 0%      22.89M ± 0%  -7.59% (p=0.002 n=6)
       │ mui-property-counts-memory-before.instructions │ mui-property-counts-memory-after.instructions │
       │                instructions/op                 │     instructions/op      vs base              │
mui-20                                      213.7G ± 3%               200.8G ± 3%  -6.02% (p=0.002 n=6)
                  │ vscode-property-counts-memory-before.txt │ vscode-property-counts-memory-after.txt │
                  │                retained-B                │       retained-B        vs base         │
ExternalMemory-20                               2.615Gi ± 0%             2.615Gi ± 0%  ~ (p=0.589 n=6)

                  │ vscode-property-counts-memory-before.txt │ vscode-property-counts-memory-after.txt │
                  │                  scan-B                  │         scan-B          vs base         │
ExternalMemory-20                               2.287Gi ± 0%             2.287Gi ± 0%  ~ (p=0.589 n=6)

                  │ vscode-property-counts-memory-before.txt │ vscode-property-counts-memory-after.txt │
                  │                   B/op                   │       B/op         vs base              │
ExternalMemory-20                               3.749Gi ± 0%        3.714Gi ± 0%  -0.92% (p=0.002 n=6)

                  │ vscode-property-counts-memory-before.txt │ vscode-property-counts-memory-after.txt │
                  │                allocs/op                 │     allocs/op      vs base              │
ExternalMemory-20                                23.60M ± 0%         23.49M ± 0%  -0.47% (p=0.002 n=6)
          │ vscode-property-counts-memory-before.instructions │ vscode-property-counts-memory-after.instructions │
          │                  instructions/op                  │         instructions/op          vs base         │
vscode-20                                         193.0G ± 4%                       193.2G ± 5%  ~ (p=0.818 n=6)

Default-threaded production CLI (six pairs; VS Code twelve pairs):
       │ mui-property-counts-cli-before.txt │ mui-property-counts-cli-after.txt │
       │             heap-B/op              │    heap-B/op      vs base         │
mui-20                         1.867Gi ± 0%       1.868Gi ± 0%  ~ (p=0.589 n=6)

       │ mui-property-counts-cli-before.txt │ mui-property-counts-cli-after.txt │
       │             allocs/op              │  allocs/op   vs base              │
mui-20                          29.52M ± 0%   27.84M ± 0%  -5.69% (p=0.002 n=6)

       │ mui-property-counts-cli-before.txt │ mui-property-counts-cli-after.txt  │
       │            check-sec/op            │ check-sec/op  vs base              │
mui-20                           11.59 ± 3%     10.67 ± 5%  -7.86% (p=0.004 n=6)
       │ mui-property-counts-cli-before.instructions │ mui-property-counts-cli-after.instructions │
       │               instructions/op               │   instructions/op     vs base              │
mui-20                                   274.6G ± 2%            250.2G ± 4%  -8.88% (p=0.002 n=6)
          │ vscode-property-counts-cli-before.txt │ vscode-property-counts-cli-after.txt │
          │               heap-B/op               │     heap-B/op       vs base          │
vscode-20                            2.828Gi ± 0%         2.828Gi ± 0%  ~ (p=0.843 n=12)

          │ vscode-property-counts-cli-before.txt │ vscode-property-counts-cli-after.txt │
          │               allocs/op               │   allocs/op    vs base               │
vscode-20                             36.62M ± 0%     36.54M ± 0%  -0.21% (p=0.000 n=12)

          │ vscode-property-counts-cli-before.txt │ vscode-property-counts-cli-after.txt │
          │             check-sec/op              │    check-sec/op     vs base          │
vscode-20                             8.671 ± 21%          8.409 ± 26%  ~ (p=0.799 n=12)
          │ vscode-property-counts-cli-before.instructions │ vscode-property-counts-cli-after.instructions │
          │                instructions/op                 │       instructions/op        vs base          │
vscode-20                                      296.5G ± 4%                   307.6G ± 3%  ~ (p=0.242 n=12)
           │ webpack-property-counts-cli-before.txt │ webpack-property-counts-cli-after.txt │
           │               heap-B/op                │      heap-B/op        vs base         │
webpack-20                             663.0Mi ± 0%           663.1Mi ± 0%  ~ (p=0.699 n=6)

           │ webpack-property-counts-cli-before.txt │ webpack-property-counts-cli-after.txt │
           │               allocs/op                │    allocs/op     vs base              │
webpack-20                              6.208M ± 0%       6.096M ± 0%  -1.80% (p=0.002 n=6)

           │ webpack-property-counts-cli-before.txt │ webpack-property-counts-cli-after.txt │
           │              check-sec/op              │     check-sec/op      vs base         │
webpack-20                               1.765 ± 8%             1.711 ± 6%  ~ (p=0.180 n=6)
           │ webpack-property-counts-cli-before.instructions │ webpack-property-counts-cli-after.instructions │
           │                 instructions/op                 │        instructions/op         vs base         │
webpack-20                                       52.37G ± 2%                     51.78G ± 3%  ~ (p=0.394 n=6)
The compact compiler layouts depend on every header belonging to the
concrete allocation identified by its tag. Unchecked kinds, retagging,
and detached headers can otherwise turn a routine mistake into an
invalid memory access.

Keep that invariant mechanically enforced without adding layout tags
or checks to hot accessors.
The owning packages may allocate records directly, but a fresh record
carries a zero tag until newType, newNode, or its mapper tag
assignment runs. If it escaped before then, the mistake surfaced only
as a later cast panic. Fresh allocations must now be upcast straight
into their constructor, or held in a local used only through its own
fields until that upcast; mappers must be tagged immediately.
A zero-value node or type record has never been tagged, and returning
its address yields a compiler record that skipped checked construction.
Named or aliased unsafe.Pointer types also hid reinterpreting
conversions from the cast boundary. Both left holes in the invariant
the analyzer exists to enforce.
Enumerating copy and declaration forms one at a time left gaps: range
assignments could retag records, named results and parameters could
carry untagged zero values, and index, receive, and call expressions
could copy a record off its header. Checking every value-producing
expression and signature for records held by value closes the class
rather than individual forms.
A record copied into a range variable or a value receiver detaches
from the arena slot that owns its tagged header, so later writes are
lost and reads can observe a stale kind. Those declarations never
appear as typed expressions, so the copy check could not see them.
Checking every defined variable also covers parameters and results,
which replaces the narrower function signature rule.
Mapper storage held by value starts with a zero tag. The lint exempted
mappers from its zero-value rule so coallocated inference mappers could
live inside their owning context, but that also let a standalone mapper,
or the address of untagged coallocated storage, escape and later panic
in Map on kind 0. The exemption now applies only to mappers stored as
struct fields, and their storage may only be addressed, explicitly or
via a pointer-receiver method call, as an argument to an
init*TypeMapper function that tags it.
A local that shadows the constructor's kind parameter passed the
spelling-only check, so newType or newNode could tag a header with an
unrelated value while the lint reported checked construction. Bulk
copies through copy or variadic append also duplicated records by
value without any diagnostic, because their arguments are slices.
Mapper kind constants are now public TypeMapperKind values, so the
lint's pairing between concrete mappers and their kind constants has
to look them up by the new names.
Dense checker link stores still keep a pointer for every occupied slot.
Those tables cost memory and require GC scanning even though values
already live in arenas.

Use four-byte indexes in the page tables. Retain bounded arena blocks
so references stay stable without geometrically over-allocating large
stores. Keep map-backed stores unchanged: compressing those did not
improve allocation usage.
A presence query needs only the page entry, not its value. Resolving
an occupied index adds arena lookup work to a boolean check.

Keep presence checks on the compressed page table, and apply the
repository linter fixes to the link-store tests.
The checker's link-store wrappers answered Has by calling TryGet, so
presence checks still resolved arena indexes even though the paged
store can answer from the page entry alone. Route them to the store
presence checks so checker queries get the cheaper path.
Instantiated and inherited object types retain a name-to-symbol map
beside their ordered property list. Those maps duplicate symbol pointers
and string headers across millions of types, increasing both live heap
and the amount of memory the collector must scan.

Use the existing property list as the source of truth for immutable
named members. Small types need no separate index; larger types need
only pointer-free integer slots. Keep map semantics for mutable module
exports, reserved members, mismatched names, and recursive member
resolution.

VS Code src, six samples versus cold value-symbol links:

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-cold-links.txt │   vscode-member-index-owned.txt    │
                   │      retained-B       │  retained-B   vs base              │
ExternalProgram-20            4.874Gi ± 0%   4.503Gi ± 0%  -7.61% (p=0.002 n=6)

                   │ vscode-cold-links.txt │   vscode-member-index-owned.txt    │
                   │        scan-B         │    scan-B     vs base              │
ExternalProgram-20            4.508Gi ± 0%   4.062Gi ± 0%  -9.89% (p=0.002 n=6)

                   │ vscode-cold-links.txt │   vscode-member-index-owned.txt    │
                   │         B/op          │     B/op      vs base              │
ExternalProgram-20            6.043Gi ± 0%   5.982Gi ± 0%  -1.00% (p=0.002 n=6)

                   │ vscode-cold-links.txt │   vscode-member-index-owned.txt   │
                   │       allocs/op       │  allocs/op   vs base              │
ExternalProgram-20             26.23M ± 0%   26.04M ± 0%  -0.71% (p=0.002 n=6)

All 321 semantic diagnostics and 10284 files are identical. CLI
diagnostic text and compiler counts match exactly. Instruction
measurements remain noisy; this change does not claim an established CPU
improvement. No GC tuning is used.
The name index and the instantiated fast path both assumed a table
whose properties are found under their own names has no other keys.
A symbol stored under its own name and an alias satisfies every
reverse lookup, so the alias was silently dropped. Checking each
(key, symbol) pair directly keeps such tables on the map path.
Ordinary type comparisons need only two 32-bit IDs and intersection
context, but retained a 128-bit hash for every cached result. Hashing
and storing twice the necessary key width wastes allocations and memory.

Keep exact 64-bit pairs in separate maps for the four intersection
states. Generic-reference normalization still uses its original
full-width hash. An explicit key tag separates both namespaces,
including recursion guards, without sacrificing hash bits or changing
constrained generic behavior.

Six fresh-process interleaved VS Code comparisons against the parent
commit, using normal GC, reduce retained heap 0.94% (roughly 33 MiB) and
total allocated bytes 1.29%. GC scanning, allocation events, and
instruction counts are not statistically different.

Tests cover directional and identity comparisons, all intersection
contexts, result replacement, exact high-bit IDs, namespace isolation,
generic parameter normalization, and constrained versus unconstrained
recursion keys.
Production diagnostics
and all semantic counts match exactly.

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-relation-before-6.txt │       vscode-relation-6.txt        │
                   │          retained-B          │  retained-B   vs base              │
ExternalProgram-20                   3.456Gi ± 0%   3.424Gi ± 0%  -0.94% (p=0.002 n=6)

                   │ vscode-relation-before-6.txt │     vscode-relation-6.txt     │
                   │            scan-B            │    scan-B     vs base         │
ExternalProgram-20                   2.998Gi ± 0%   2.997Gi ± 0%  ~ (p=0.310 n=6)

                   │ vscode-relation-before-6.txt │       vscode-relation-6.txt        │
                   │             B/op             │     B/op      vs base              │
ExternalProgram-20                   5.021Gi ± 0%   4.956Gi ± 0%  -1.29% (p=0.002 n=6)

                   │ vscode-relation-before-6.txt │    vscode-relation-6.txt     │
                   │          allocs/op           │  allocs/op   vs base         │
ExternalProgram-20                    31.08M ± 0%   31.07M ± 0%  ~ (p=0.240 n=6)

                        │ relation-before-instructions.txt │    relation-instructions.txt     │
                        │         instructions/op          │ instructions/op  vs base         │
ExternalInstructions-20                        269.3G ± 2%       270.0G ± 3%  ~ (p=0.937 n=6)
Complete non-augmented properties are valid for augmented lookup, but
copying each result into both caches retains duplicate name tables.
MUI keeps 2,734,919 identical entries this way, nearly doubling its
union/intersection cache storage without adding semantic information.

Preserve independent augmented results and partial-property behavior
while sharing complete entries. A failed lookup needs no empty table.
The MUI census falls from 230242 tables and 5628201 entries to 116635
tables and 2893282 entries; all distinct cached identities remain.

Six fresh-process interleaved single-checker comparisons against the
parent commit, with ordinary GC, save 135.63 MiB of retained MUI heap
(-8.15%) and 132.00 MiB of GC scanning (-9.22%). Total allocated bytes
fall 4.45% and allocation events fall 1.46%. VS Code's corresponding
reductions are small: retained -0.15%, scan -0.17%, allocated -0.16%.
Instruction differences in these single-checker comparisons are
inconclusive; elapsed time is noisy on the shared machine.

Six default-threaded production CLI pairs confirm MUI's reported heap
falls 9.29% and instructions fall 2.60%. VS Code and Webpack have small
heap reductions and inconclusive instruction differences. These are
incremental savings on top of the earlier branch optimizations.
CLI-reported heap is not the forced-GC retained-heap measure above.

MUI uses the CI-pinned source and restored scenario dependencies at
6780195595c12252a130aa5ae5c5bd461229c6b7. VS Code uses
8bf178e1e1c2be3723f14683f7b1e5fdb3f780e4. Webpack uses an isolated
2289141381f2c1c965cb65118fa0ffe2e9e19834 with restored dependencies.
Production diagnostics and all semantic counts match exactly.

Tests cover both query orders, both composite kinds, cache growth and
GC reachability, missing entries, read/write partial flags, differing
mode-specific identities, and real function-property augmentation.
The storage regressions fail before this change.

Single-checker retained heap and allocation measurements:

                  │ mui-shared-union-before.txt │    mui-shared-union-shared.txt     │
                  │         retained-B          │  retained-B   vs base              │
ExternalMemory-20                  1.624Gi ± 0%   1.492Gi ± 0%  -8.15% (p=0.002 n=6)

                  │ mui-shared-union-before.txt │    mui-shared-union-shared.txt     │
                  │           scan-B            │    scan-B     vs base              │
ExternalMemory-20                  1.398Gi ± 0%   1.270Gi ± 0%  -9.22% (p=0.002 n=6)

                  │ mui-shared-union-before.txt │    mui-shared-union-shared.txt     │
                  │            B/op             │     B/op      vs base              │
ExternalMemory-20                  5.364Gi ± 0%   5.125Gi ± 0%  -4.45% (p=0.002 n=6)

                  │ mui-shared-union-before.txt │    mui-shared-union-shared.txt    │
                  │          allocs/op          │  allocs/op   vs base              │
ExternalMemory-20                   25.17M ± 0%   24.80M ± 1%  -1.46% (p=0.002 n=6)
                  │ vscode-shared-union-before.txt │   vscode-shared-union-shared.txt   │
                  │           retained-B           │  retained-B   vs base              │
ExternalMemory-20                     2.619Gi ± 0%   2.615Gi ± 0%  -0.15% (p=0.002 n=6)

                  │ vscode-shared-union-before.txt │   vscode-shared-union-shared.txt   │
                  │             scan-B             │    scan-B     vs base              │
ExternalMemory-20                     2.291Gi ± 0%   2.287Gi ± 0%  -0.17% (p=0.002 n=6)

                  │ vscode-shared-union-before.txt │   vscode-shared-union-shared.txt   │
                  │              B/op              │     B/op      vs base              │
ExternalMemory-20                     3.754Gi ± 0%   3.748Gi ± 0%  -0.16% (p=0.002 n=6)

                  │ vscode-shared-union-before.txt │  vscode-shared-union-shared.txt   │
                  │           allocs/op            │  allocs/op   vs base              │
ExternalMemory-20                      23.61M ± 0%   23.59M ± 0%  -0.08% (p=0.002 n=6)

Single-checker instructions:

                        │ mui-shared-union-before.instructions │ mui-shared-union-shared.instructions │
                        │           instructions/op            │   instructions/op    vs base         │
ExternalInstructions-20                            218.9G ± 3%           217.3G ± 2%  ~ (p=0.310 n=6)
                        │ vscode-shared-union-before.instructions │ vscode-shared-union-shared.instructions │
                        │             instructions/op             │    instructions/op      vs base         │
ExternalInstructions-20                               188.8G ± 3%              192.1G ± 2%  ~ (p=0.394 n=6)

Default-threaded production CLI:

           │ shared-union-cli-before.txt │      shared-union-cli-after.txt       │
           │       instructions/op       │ instructions/op  vs base              │
mui-20                       283.3G ± 1%       275.9G ± 2%  -2.60% (p=0.015 n=6)
vscode-20                    308.2G ± 7%       293.0G ± 6%       ~ (p=0.818 n=6)
webpack-20                   51.96G ± 5%       51.82G ± 4%       ~ (p=1.000 n=6)
geomean                      165.6G            161.2G       -2.62%

           │ shared-union-cli-before.txt │     shared-union-cli-after.txt     │
           │          heap-B/op          │  heap-B/op    vs base              │
mui-20                      2.059Gi ± 0%   1.868Gi ± 0%  -9.29% (p=0.002 n=6)
vscode-20                   2.835Gi ± 0%   2.829Gi ± 0%  -0.21% (p=0.004 n=6)
webpack-20                  666.9Mi ± 0%   663.0Mi ± 0%  -0.57% (p=0.002 n=6)
geomean                     1.561Gi        1.507Gi       -3.45%

           │ shared-union-cli-before.txt │    shared-union-cli-after.txt     │
           │          allocs/op          │  allocs/op   vs base              │
mui-20                       29.84M ± 0%   29.55M ± 0%  -0.97% (p=0.002 n=6)
vscode-20                    36.67M ± 2%   36.64M ± 0%       ~ (p=0.132 n=6)
webpack-20                   6.235M ± 2%   6.208M ± 0%  -0.43% (p=0.002 n=6)
geomean                      18.97M        18.87M       -0.49%

           │ shared-union-cli-before.txt │     shared-union-cli-after.txt     │
           │        check-sec/op         │ check-sec/op  vs base              │
mui-20                        8.986 ± 6%    8.559 ±  4%  -4.75% (p=0.026 n=6)
vscode-20                     8.345 ± 4%    8.900 ± 10%       ~ (p=0.132 n=6)
webpack-20                    1.851 ± 8%    1.818 ±  8%       ~ (p=0.310 n=6)
geomean                       5.178         5.173        -0.08%
getReducedType runs somePropertyReducesToNever on intersections. It
used to create and cache a synthetic property for every property name
shared by more than one constituent, only to inspect its flags. With
large JSX prop intersections, as in MUI, most of those properties were
never looked up again, yet they stayed in the intersection's property
cache with their symbols and links.

Collect the constituent properties without building the combined
symbol, and only create the real property in the rare merged
instantiation case.

mui-docs:

          │    before     │                after                │
          │ memory-used-B │ memory-used-B  vs base              │
  MUIDocs    1.857Gi ± 0%    1.717Gi ± 0%  -7.55% (p=0.002 n=6)

          │   before    │               after               │
          │   allocs    │   allocs     vs base              │
  MUIDocs   27.29M ± 0%   25.19M ± 0%  -7.72% (p=0.002 n=6)

          │    before    │               after                │
          │ allocated-B  │ allocated-B   vs base              │
  MUIDocs   4.730Gi ± 0%   4.556Gi ± 0%  -3.68% (p=0.002 n=6)

          │   before    │               after                │
          │   symbols   │   symbols    vs base               │
  MUIDocs   4.332M ± 0%   3.663M ± 0%  -15.43% (p=0.002 n=6)
Synthesizing or probing a union or intersection property gathers the
distinct constituent properties into a set. That set rarely holds more
than a handful of symbols, but collections.OrderedSet always allocates
both a map and a key slice, and this runs for every property of every
combined type that is enumerated during relation checks.

Keep the distinct properties in a plain slice, and index them with a
map only once the slice passes the same threshold used by orderedSet.

mui-docs:

          │   before    │               after               │
          │   allocs    │   allocs     vs base              │
  MUIDocs   25.19M ± 0%   23.32M ± 1%  -7.41% (p=0.002 n=6)

          │    before    │               after                │
          │ allocated-B  │ allocated-B   vs base              │
  MUIDocs   4.556Gi ± 0%   4.389Gi ± 1%  -3.66% (p=0.002 n=6)
Enumerating the properties of a union or intersection tracks which
names have already been combined. A fresh set is allocated for every
enumeration, and on large projects those sets account for a sizable
share of all allocated bytes, adding GC work for no lasting benefit.

Borrow the set from a per-checker free list instead. Enumeration can
recurse into other combined types, so each call still takes its own
set.

mui-docs:

          │    before    │               after                │
          │ allocated-B  │ allocated-B   vs base              │
  MUIDocs   4.389Gi ± 1%   4.092Gi ± 0%  -6.76% (p=0.002 n=6)

          │   before    │               after               │
          │   allocs    │   allocs     vs base              │
  MUIDocs   23.32M ± 1%   23.18M ± 0%  -0.60% (p=0.002 n=6)
@jakebailey

Copy link
Copy Markdown
Member Author

The remaining work is now in independent PRs: #64775, #64781, #64788, #64789, #64791, #64815.

@jakebailey
Jake Bailey (jakebailey) deleted the data-oriented-compiler branch October 14, 2026 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants