Skip to content

Speed up removeSubtypes by looking up each target's key property type once per key property name - #65061

Open
Mateusz Burzyński (Andarist) wants to merge 1 commit into
microsoft:mainfrom
Andarist:experiment/remove-subtypes-key-types
Open

Mateusz Burzyński (Andarist) wants to merge 1 commit into
microsoft:mainfrom
Andarist:experiment/remove-subtypes-key-types

Conversation

@Andarist

Copy link
Copy Markdown
Contributor

No description provided.

@typescript-automation typescript-automation Bot added the For Uncommitted Bug PR for untriaged, rejected, closed or missing bug label Oct 30, 2026
@jakebailey

Copy link
Copy Markdown
Member

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

@typescript-automation

typescript-automation Bot commented Oct 30, 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
@jakebailey Jake Bailey (jakebailey) added the Domain: Performance Reports of unusually slow behavior label Oct 30, 2026
@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=20
Symbols 88,466 88,466 ~ ~ ~ p=1.000 n=20
Types 79,607 79,607 ~ ~ ~ p=1.000 n=20
Memory Used 104,095k (± 0.03%) 104,096k (± 0.03%) ~ 103,990k 104,244k p=0.846 n=20
Memory Allocs 1,262,381 (± 0.01%) 1,262,555 (± 0.01%) +174 (+ 0.01%) 1,262,324 1,262,841 p=0.001 n=20
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Parse Time 0.023s (± 2.87%) 0.023s (± 2.45%) ~ 0.021s 0.025s p=0.493 n=20
Bind Time 0.008s (± 6.45%) 0.009s (± 6.91%) ~ 0.007s 0.011s p=0.219 n=20
Check Time 0.216s (± 0.92%) 0.200s (± 0.64%) 🟩-0.016s (- 7.38%) 0.195s 0.207s p=0.000 n=20
Emit Time 0.141s (± 1.29%) 0.142s (± 1.17%) ~ 0.135s 0.150s p=0.447 n=20
Total Time 0.392s (± 0.59%) 0.377s (± 0.62%) 🟩-0.014s (- 3.65%) 0.366s 0.386s p=0.000 n=20
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=20
Symbols 586,583 (± 0.01%) 586,616 (± 0.01%) ~ 586,190 586,883 p=0.565 n=20
Types 241,686 (± 0.00%) 241,688 (± 0.00%) ~ 241,685 241,696 p=0.199 n=20
Memory Used 517,827k (± 0.02%) 517,799k (± 0.02%) ~ 517,307k 518,287k p=0.779 n=20
Memory Allocs 7,789,854 (± 0.06%) 7,794,292 (± 0.13%) ~ 7,780,515 7,847,757 p=0.429 n=20
Config Time 0.008s (± 1.77%) 0.008s (± 1.30%) ~ 0.008s 0.009s p=1.000 n=20
Parse Time 0.121s (± 3.59%) 0.126s (± 3.16%) 🔻+0.005s (+ 4.12%) 0.112s 0.149s p=0.034 n=20
Bind Time 0.045s (±10.97%) 0.040s (± 7.69%) ~ 0.036s 0.063s p=0.280 n=20
Check Time 0s 0s ~ ~ ~ p=1.000 n=20
Emit Time 0.835s (± 1.03%) 0.830s (± 0.74%) ~ 0.807s 0.862s p=0.533 n=20
Total Time 1.020s (± 1.17%) 1.013s (± 0.92%) ~ 0.983s 1.067s p=0.673 n=20
arktype - native
Errors 0 0 ~ ~ ~ p=1.000 n=20
Symbols 685,920 685,920 ~ ~ ~ p=1.000 n=20
Types 939,467 939,467 ~ ~ ~ p=1.000 n=20
Memory Used 495,108k (± 0.01%) 495,078k (± 0.01%) ~ 494,827k 495,281k p=0.473 n=20
Memory Allocs 12,062,307 (± 0.01%) 12,062,981 (± 0.01%) ~ 12,058,453 12,069,148 p=0.495 n=20
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=20
Parse Time 0.041s (± 3.17%) 0.041s (± 3.50%) ~ 0.038s 0.047s p=0.814 n=20
Bind Time 0.013s (±10.01%) 0.013s (±10.46%) ~ 0.010s 0.019s p=0.712 n=20
Check Time 0.864s (± 0.47%) 0.864s (± 0.79%) ~ 0.837s 0.893s p=1.000 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 0.947s (± 0.38%) 0.949s (± 0.64%) ~ 0.922s 0.975s p=0.507 n=20
class-transformer - native
Errors 0 0 ~ ~ ~ p=1.000 n=20
Symbols 45,376 45,376 ~ ~ ~ p=1.000 n=20
Types 7,573 7,573 ~ ~ ~ p=1.000 n=20
Memory Used 27,840k (± 0.02%) 27,835k (± 0.01%) ~ 27,819k 27,845k p=0.098 n=20
Memory Allocs 248,301 (± 0.04%) 248,213 (± 0.06%) ~ 247,814 249,033 p=0.180 n=20
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Parse Time 0.012s (± 3.07%) 0.012s (± 4.00%) ~ 0.009s 0.013s p=0.597 n=20
Bind Time 0.003s (±10.36%) 0.003s (± 8.07%) ~ 0.003s 0.005s p=0.969 n=20
Check Time 0.008s (± 4.40%) 0.008s (± 5.20%) ~ 0.006s 0.010s p=0.432 n=20
Emit Time 0.008s (± 4.90%) 0.008s (± 5.51%) ~ 0.007s 0.010s p=0.943 n=20
Total Time 0.032s (± 1.58%) 0.032s (± 1.45%) ~ 0.029s 0.033s p=0.302 n=20
effect - native
Errors 12 12 ~ ~ ~ p=1.000 n=20
Symbols 1,235,115 1,235,115 ~ ~ ~ p=1.000 n=20
Types 894,113 894,113 ~ ~ ~ p=1.000 n=20
Memory Used 939,153k (± 0.02%) 939,101k (± 0.02%) ~ 938,561k 940,446k p=0.380 n=20
Memory Allocs 12,632,671 (± 0.02%) 12,638,289 (± 0.03%) +5,619 (+ 0.04%) 12,631,264 12,669,559 p=0.002 n=20
Config Time 0.002s (± 5.09%) 0.002s ~ ~ ~ p=1.000 n=20
Parse Time 0.152s (± 1.36%) 0.150s (± 1.31%) ~ 0.143s 0.158s p=0.081 n=20
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Check Time 0.921s (± 0.86%) 0.906s (± 0.79%) -0.015s (- 1.62%) 0.885s 0.934s p=0.010 n=20
Emit Time 0.509s (± 2.48%) 0.513s (± 2.24%) ~ 0.465s 0.549s p=0.482 n=20
Total Time 1.677s (± 0.88%) 1.666s (± 0.82%) ~ 1.616s 1.726s p=0.229 n=20
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=20
Symbols 3,784,019 3,784,019 ~ ~ ~ p=1.000 n=20
Types 1,355,974 1,355,974 ~ ~ ~ p=1.000 n=20
Memory Used 1,768,864k (± 0.08%) 1,768,274k (± 0.10%) ~ 1,761,582k 1,777,830k p=0.512 n=20
Memory Allocs 25,749,107 (± 0.16%) 25,731,610 (± 0.11%) ~ 25,653,388 25,870,919 p=0.820 n=20
Config Time 0.008s (± 2.82%) 0.009s (± 2.73%) ~ 0.008s 0.009s p=0.527 n=20
Parse Time 0.293s (± 2.16%) 0.300s (± 1.56%) +0.007s (+ 2.30%) 0.285s 0.329s p=0.039 n=20
Bind Time 0.001s 0.001s ~ ~ ~ p=1.000 n=20
Check Time 2.985s (± 0.73%) 2.985s (± 0.64%) ~ 2.885s 3.069s p=0.941 n=20
Emit Time 0.244s (± 1.00%) 0.244s (± 1.39%) ~ 0.233s 0.257s p=0.867 n=20
Total Time 4.033s (± 0.63%) 4.032s (± 0.51%) ~ 3.921s 4.120s p=0.909 n=20
sentry - native
Errors 2 2 ~ ~ ~ p=1.000 n=20
Symbols 4,793,245 4,793,245 ~ ~ ~ p=1.000 n=20
Types 2,607,045 2,607,045 ~ ~ ~ p=1.000 n=20
Memory Used 2,846,342k (± 0.03%) 2,846,884k (± 0.03%) ~ 2,844,045k 2,849,161k p=0.398 n=20
Memory Allocs 75,264,234 (± 0.36%) 75,103,566 (± 0.42%) ~ 74,678,616 77,685,127 p=0.149 n=20
Config Time 0.025s (± 1.35%) 0.025s (± 1.41%) ~ 0.024s 0.026s p=0.815 n=20
Parse Time 0.478s (± 3.30%) 0.467s (± 2.97%) ~ 0.425s 0.518s p=0.279 n=20
Bind Time 0.152s (±11.03%) 0.155s (±10.10%) ~ 0.130s 0.237s p=0.753 n=20
Check Time 6.665s (± 0.97%) 6.664s (± 1.26%) ~ 6.445s 7.110s p=0.805 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 7.373s (± 0.90%) 7.363s (± 1.17%) ~ 7.083s 7.810s p=0.634 n=20
social-app - native
Errors 0 0 ~ ~ ~ p=1.000 n=20
Symbols 1,883,074 1,883,074 ~ ~ ~ p=1.000 n=20
Types 1,158,168 1,158,168 ~ ~ ~ p=1.000 n=20
Memory Used 966,857k (± 0.01%) 966,769k (± 0.01%) ~ 966,316k 967,273k p=0.331 n=20
Memory Allocs 13,507,983 (± 0.20%) 13,487,410 (± 0.08%) ~ 13,446,287 13,536,342 p=0.659 n=20
Config Time 0.008s 0.008s ~ ~ ~ p=1.000 n=20
Parse Time 0.159s (± 3.33%) 0.157s (± 2.30%) ~ 0.145s 0.172s p=0.683 n=20
Bind Time 0.043s (± 9.72%) 0.043s (± 9.35%) ~ 0.036s 0.061s p=0.585 n=20
Check Time 1.422s (± 0.90%) 1.418s (± 0.65%) ~ 1.381s 1.472s p=0.560 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 1.649s (± 0.72%) 1.642s (± 0.50%) ~ 1.612s 1.689s p=0.417 n=20
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=20
Symbols 1,184,972 1,184,972 ~ ~ ~ p=1.000 n=20
Types 438,963 438,963 ~ ~ ~ p=1.000 n=20
Memory Used 1,163,912k (± 0.24%) 1,166,681k (± 0.31%) ~ 1,157,008k 1,192,420k p=0.429 n=20
Memory Allocs 47,467,092 (± 0.10%) 47,532,301 (± 0.10%) +65,209 (+ 0.14%) 47,360,629 47,742,445 p=0.028 n=20
Config Time 0.002s (±22.85%) 0.002s (±14.66%) ~ 0.001s 0.003s p=0.463 n=20
Parse Time 0.139s (± 1.40%) 0.140s (± 1.41%) ~ 0.133s 0.147s p=0.783 n=20
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Check Time 0.810s (± 0.49%) 0.808s (± 0.95%) ~ 0.792s 0.865s p=0.122 n=20
Emit Time 0.140s (± 1.07%) 0.140s (± 1.34%) ~ 0.133s 0.147s p=0.514 n=20
Total Time 9.378s (± 0.39%) 9.393s (± 0.69%) ~ 9.245s 9.884s p=1.000 n=20
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=20
Symbols 263,511 263,511 ~ ~ ~ p=1.000 n=20
Types 196,116 196,116 ~ ~ ~ p=1.000 n=20
Memory Used 224,122k (± 0.02%) 224,133k (± 0.02%) ~ 223,915k 224,266k p=0.542 n=20
Memory Allocs 2,389,253 (± 0.02%) 2,390,309 (± 0.02%) +1,056 (+ 0.04%) 2,388,507 2,391,318 p=0.000 n=20
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Parse Time 0.055s (± 7.83%) 0.053s (± 4.00%) ~ 0.046s 0.061s p=0.515 n=20
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Check Time 0.403s (± 1.21%) 0.398s (± 0.81%) -0.006s (- 1.40%) 0.390s 0.415s p=0.028 n=20
Emit Time 0.050s (± 4.76%) 0.049s (± 5.60%) ~ 0.043s 0.058s p=0.633 n=20
Total Time 0.538s (± 1.99%) 0.528s (± 0.70%) ~ 0.515s 0.545s p=0.054 n=20
t3code-server - native
Errors 0 0 ~ ~ ~ p=1.000 n=20
Symbols 4,350,661 4,350,661 ~ ~ ~ p=1.000 n=20
Types 3,040,644 3,040,644 ~ ~ ~ p=1.000 n=20
Memory Used 2,425,771k (± 0.03%) 2,425,906k (± 0.03%) ~ 2,423,708k 2,428,372k p=0.583 n=20
Memory Allocs 37,192,412 (± 0.10%) 37,176,888 (± 0.05%) ~ 37,121,313 37,291,411 p=0.947 n=20
Config Time 0.003s (± 4.95%) 0.003s (± 8.12%) ~ 0.002s 0.003s p=0.235 n=20
Parse Time 0.249s (± 1.71%) 0.250s (± 2.40%) ~ 0.228s 0.277s p=0.963 n=20
Bind Time 0.082s (± 8.70%) 0.084s (± 8.89%) ~ 0.072s 0.125s p=0.623 n=20
Check Time 6.654s (± 0.61%) 6.622s (± 0.46%) ~ 6.536s 6.821s p=0.194 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 6.999s (± 0.59%) 6.970s (± 0.41%) ~ 6.887s 7.156s p=0.245 n=20
tanstack-router - native
Errors 1 1 ~ ~ ~ p=1.000 n=20
Symbols 571,756 571,756 ~ ~ ~ p=1.000 n=20
Types 397,689 397,689 ~ ~ ~ p=1.000 n=20
Memory Used 326,097k (± 0.02%) 326,096k (± 0.02%) ~ 325,874k 326,259k p=0.815 n=20
Memory Allocs 4,335,133 (± 0.19%) 4,342,642 (± 0.31%) ~ 4,320,168 4,443,252 p=0.414 n=20
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=20
Parse Time 0.039s (± 3.70%) 0.040s (± 3.69%) ~ 0.034s 0.045s p=0.682 n=20
Bind Time 0.012s (±11.28%) 0.013s (±10.33%) ~ 0.011s 0.021s p=0.252 n=20
Check Time 0.507s (± 0.61%) 0.510s (± 0.80%) ~ 0.493s 0.525s p=0.109 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 0.576s (± 0.62%) 0.581s (± 0.78%) ~ 0.558s 0.596s p=0.079 n=20
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=20
Symbols 231,616 231,616 ~ ~ ~ p=1.000 n=20
Types 181,195 181,195 ~ ~ ~ p=1.000 n=20
Memory Used 193,200k (± 0.01%) 193,198k (± 0.01%) ~ 193,130k 193,249k p=0.825 n=20
Memory Allocs 1,310,800 (± 0.01%) 1,311,825 (± 0.02%) +1,026 (+ 0.08%) 1,311,053 1,312,898 p=0.000 n=20
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Parse Time 0.043s (± 3.48%) 0.043s (± 2.84%) ~ 0.038s 0.047s p=0.984 n=20
Bind Time 0.020s (± 6.38%) 0.019s (± 4.63%) ~ 0.017s 0.023s p=0.382 n=20
Check Time 0.293s (± 0.96%) 0.294s (± 0.95%) ~ 0.282s 0.303s p=0.783 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 0.363s (± 0.87%) 0.363s (± 0.77%) ~ 0.348s 0.373s p=0.723 n=20
vscode - native
Errors 11 11 ~ ~ ~ p=1.000 n=20
Symbols 7,558,293 7,558,293 ~ ~ ~ p=1.000 n=20
Types 4,444,220 4,444,220 ~ ~ ~ p=1.000 n=20
Memory Used 5,234,182k (± 0.01%) 5,234,951k (± 0.02%) ~ 5,231,293k 5,244,103k p=0.369 n=20
Memory Allocs 57,320,158 (± 0.02%) 57,346,346 (± 0.07%) +26,188 (+ 0.05%) 57,314,570 57,688,102 p=0.001 n=20
Config Time 0.033s (± 0.90%) 0.033s (± 0.83%) ~ 0.032s 0.035s p=0.603 n=20
Parse Time 0.904s (± 2.15%) 0.894s (± 1.27%) ~ 0.849s 0.968s p=0.358 n=20
Bind Time 0.291s (± 0.86%) 0.293s (± 0.62%) ~ 0.285s 0.301s p=0.215 n=20
Check Time 7.215s (± 0.58%) 7.190s (± 0.53%) ~ 7.052s 7.428s p=0.176 n=20
Emit Time 2.734s (± 3.27%) 2.719s (± 2.46%) ~ 2.622s 3.169s p=0.644 n=20
Total Time 11.234s (± 0.77%) 11.185s (± 0.54%) ~ 11.042s 11.450s p=0.365 n=20
webpack - native
Errors 612 612 ~ ~ ~ p=1.000 n=20
Symbols 925,722 925,722 ~ ~ ~ p=1.000 n=20
Types 650,041 650,041 ~ ~ ~ p=1.000 n=20
Memory Used 697,593k (± 0.01%) 697,641k (± 0.02%) ~ 697,230k 698,121k p=0.482 n=20
Memory Allocs 6,506,825 (± 0.08%) 6,506,630 (± 0.05%) ~ 6,498,022 6,522,997 p=0.659 n=20
Config Time 0.004s 0.004s ~ ~ ~ p=1.000 n=20
Parse Time 0.147s (± 2.64%) 0.145s (± 2.70%) ~ 0.124s 0.158s p=0.507 n=20
Bind Time 0.043s (± 6.83%) 0.042s (±10.40%) -0.001s (- 2.08%) 0.035s 0.071s p=0.029 n=20
Check Time 1.002s (± 0.32%) 1.003s (± 0.50%) ~ 0.984s 1.025s p=0.920 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 1.220s (± 0.42%) 1.217s (± 0.70%) ~ 1.175s 1.247s p=0.625 n=20
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=20
Symbols 640,490 640,490 ~ ~ ~ p=1.000 n=20
Types 387,984 387,984 ~ ~ ~ p=1.000 n=20
Memory Used 349,602k (± 0.03%) 349,558k (± 0.02%) ~ 349,362k 349,927k p=0.529 n=20
Memory Allocs 3,968,463 (± 0.06%) 3,968,548 (± 0.08%) ~ 3,957,126 3,983,993 p=0.989 n=20
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=20
Parse Time 0.059s (± 1.75%) 0.061s (± 3.87%) ~ 0.055s 0.073s p=0.314 n=20
Bind Time 0.021s (± 9.42%) 0.019s (± 8.50%) 🟩-0.002s (-10.71%) 0.016s 0.027s p=0.041 n=20
Check Time 0.390s (± 0.78%) 0.392s (± 1.59%) ~ 0.376s 0.432s p=0.995 n=20
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=20
Total Time 0.477s (± 0.85%) 0.478s (± 1.47%) ~ 0.457s 0.521s p=0.899 n=20
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • arktype - native
  • class-transformer - native
  • effect - native
  • mui-docs - native
  • sentry - native
  • social-app - native
  • strada-build-src - native
  • strada-compiler - native
  • t3code-server - native
  • tanstack-router - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 20
Baseline baseline 20

Developer Information:

Download Benchmarks

@Andarist
Mateusz Burzyński (Andarist) marked this pull request as ready for review October 31, 2026 08:30
Copilot AI balanced review requested due to automatic review settings October 31, 2026 08:30
@typescript-automation

Copy link
Copy Markdown
Contributor

This PR doesn't have any linked issues. Please open an issue that references this PR. From there we can discuss and prioritise.

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.

🟢 Approval recommended

No active review issues are recorded for the target key-property lookup caching change in removeSubtypes.

No open issues 🎉

What changed in this PR

This PR optimizes removeSubtypes in the native TypeScript checker by reusing target key-property type lookups across sources with the same key-property name.

Changes:

  • Caches each target’s regularized unit type or a sentinel for missing/non-unit properties.
  • Clears the cache when the key-property name changes and keeps it aligned when types are removed.
File Description
tsc/​internal/​checker/​checker.go Adds and maintains the target key-property type cache in removeSubtypes.

Review effort: Balanced

This branch has not been deployed

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

Labels

Domain: Performance Reports of unusually slow behavior For Uncommitted Bug PR for untriaged, rejected, closed or missing bug

3 participants