Skip to content

Memoize repeated inference walks - #64880

Draft
Jake Bailey (jakebailey) wants to merge 1 commit into
microsoft:mainfrom
jakebailey:perf/inference-walk-memo
Draft

Jake Bailey (jakebailey) wants to merge 1 commit into
microsoft:mainfrom
jakebailey:perf/inference-walk-memo

Conversation

@jakebailey

Copy link
Copy Markdown
Member

WIP

Some inference walks are long and are made again and again with the
same inputs. With Effect Schema, every call such as Schema.optional(x)
inside a Struct({ ... }) infers from the contextual Constraint type to
the combinator's return type, optional<S>, whose members span the large
schema interfaces. Each call repeats that walk from fresh inference
infos and always ends in the same candidates. Effect-heavy code like
t3code spends a large share of its check time this way.

When every inference info is still in its initial state, the outcome of
a walk is now remembered under its source, target, priority,
contravariance and type parameters, as long as the walk computed nothing
new and observed no transient state, so walking it again would take the
same path. Transient state is any read of an in-progress resolution,
signature resolution, variance computation, flow loop or flow type
cache, which are now counted.

Measured with --checkers 4 (n=8):

                      │ before.txt │            after.txt             │
                      │   sec/op   │   sec/op    vs base              │
    Tsc/bluesky         3.069 ± 4%   3.024 ± 1%  -1.47% (p=0.038 n=8)
    Tsc/sentry          12.74 ± 2%   12.62 ± 1%       ~ (p=0.382 n=8)
    Tsc/t3code-server   16.81 ± 3%   16.12 ± 4%  -4.12% (p=0.028 n=8)
    geomean             8.694        8.505       -2.17%

                      │  before.txt  │             after.txt              │
                      │    rss-B     │    rss-B      vs base              │
    Tsc/bluesky         1.422Gi ± 2%   1.413Gi ± 1%       ~ (p=0.959 n=8)
    Tsc/sentry          4.571Gi ± 8%   4.617Gi ± 4%       ~ (p=0.721 n=8)
    Tsc/t3code-server   4.378Gi ± 2%   4.650Gi ± 6%  +6.21% (p=0.038 n=8)
    geomean             3.053Gi        3.119Gi       +2.16%

                      │  before.txt  │             after.txt              │
                      │    heap-B    │    heap-B     vs base              │
    Tsc/bluesky         1.152Gi ± 0%   1.153Gi ± 0%       ~ (p=0.195 n=8)
    Tsc/sentry          3.620Gi ± 0%   3.622Gi ± 0%       ~ (p=0.195 n=8)
    Tsc/t3code-server   3.761Gi ± 0%   3.763Gi ± 0%  +0.04% (p=0.000 n=8)
    geomean             2.504Gi        2.504Gi       +0.03%
@typescript-automation typescript-automation Bot added Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug labels Oct 19, 2026
@jakebailey

Copy link
Copy Markdown
Member Author

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

@typescript-automation

typescript-automation Bot commented Oct 19, 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 113,557k (± 0.06%) 113,543k (± 0.04%) ~ 113,454k 113,700k p=0.855 n=12
Memory Allocs 2,212,594 (± 0.01%) 2,216,866 (± 0.00%) +4,272 (+ 0.19%) 2,216,624 2,217,096 p=0.000 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.041s (± 5.67%) 0.039s (± 3.82%) ~ 0.036s 0.043s p=0.347 n=12
Bind Time 0.014s (±10.98%) 0.013s (± 9.68%) ~ 0.011s 0.017s p=0.392 n=12
Check Time 0.468s (± 0.79%) 0.463s (± 0.75%) -0.005s (- 1.09%) 0.456s 0.476s p=0.016 n=12
Emit Time 0.262s (± 1.78%) 0.271s (± 2.65%) +0.009s (+ 3.47%) 0.252s 0.291s p=0.037 n=12
Total Time 0.791s (± 0.95%) 0.793s (± 1.02%) ~ 0.773s 0.821s p=0.744 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 847,423 (± 0.05%) 846,519 (± 0.08%) -904 (- 0.11%) 844,779 847,818 p=0.039 n=12
Types 247,032 (± 0.00%) 247,033 (± 0.00%) ~ 247,030 247,042 p=0.283 n=12
Memory Used 596,390k (± 0.02%) 596,802k (± 0.03%) +412k (+ 0.07%) 596,336k 597,169k p=0.000 n=12
Memory Allocs 13,138,365 (± 0.02%) 13,196,866 (± 0.02%) +58,501 (+ 0.45%) 13,193,130 13,202,238 p=0.000 n=12
Config Time 0.017s (± 1.45%) 0.017s (± 1.99%) ~ 0.016s 0.017s p=0.193 n=12
Parse Time 0.220s (± 2.30%) 0.220s (± 1.91%) ~ 0.212s 0.236s p=0.898 n=12
Bind Time 0.085s (±11.29%) 0.079s (± 9.75%) ~ 0.059s 0.096s p=0.311 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.539s (± 1.75%) 1.531s (± 1.55%) ~ 1.474s 1.611s p=0.504 n=12
Total Time 1.880s (± 1.74%) 1.868s (± 1.61%) ~ 1.800s 1.950s p=0.541 n=12
arktype - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,757,463 1,757,463 ~ ~ ~ p=1.000 n=12
Types 943,966 943,966 ~ ~ ~ p=1.000 n=12
Memory Used 703,722k (± 0.01%) 703,878k (± 0.01%) +156k (+ 0.02%) 703,775k 704,052k p=0.000 n=12
Memory Allocs 13,291,034 (± 0.01%) 13,515,196 (± 0.02%) +224,162 (+ 1.69%) 13,512,263 13,525,061 p=0.000 n=12
Config Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Parse Time 0.069s (± 2.98%) 0.071s (± 3.09%) ~ 0.067s 0.077s p=0.557 n=12
Bind Time 0.020s (± 5.29%) 0.020s (± 5.64%) ~ 0.018s 0.023s p=0.906 n=12
Check Time 2.068s (± 0.56%) 2.075s (± 0.43%) ~ 2.054s 2.104s p=0.235 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 2.201s (± 0.53%) 2.212s (± 0.39%) ~ 2.194s 2.237s p=0.124 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 4,331,983 4,331,983 ~ ~ ~ p=1.000 n=12
Types 1,370,520 1,370,520 ~ ~ ~ p=1.000 n=12
Memory Used 2,624,615k (± 0.05%) 2,625,673k (± 0.04%) ~ 2,622,931k 2,627,637k p=0.242 n=12
Memory Allocs 27,706,524 (± 0.05%) 27,755,652 (± 0.07%) +49,128 (+ 0.18%) 27,717,138 27,805,863 p=0.000 n=12
Config Time 0.017s (± 1.07%) 0.017s (± 1.70%) ~ 0.016s 0.017s p=0.590 n=12
Parse Time 0.468s (± 2.35%) 0.471s (± 2.04%) ~ 0.439s 0.494s p=0.832 n=12
Bind Time 0.002s 0.002s (±24.21%) ~ 0.002s 0.005s p=1.000 n=12
Check Time 7.248s (± 0.40%) 7.190s (± 0.62%) -0.058s (- 0.80%) 7.138s 7.371s p=0.003 n=12
Emit Time 0.563s (± 9.91%) 0.556s (±12.47%) ~ 0.414s 0.662s p=0.855 n=12
Total Time 9.058s (± 0.32%) 8.986s (± 0.58%) -0.072s (- 0.79%) 8.794s 9.075s p=0.012 n=12
sentry - native
Errors 2 2 ~ ~ ~ p=1.000 n=12
Symbols 7,459,653 7,459,653 ~ ~ ~ p=1.000 n=12
Types 2,647,172 2,647,172 ~ ~ ~ p=1.000 n=12
Memory Used 3,803,318k (± 0.03%) 3,805,152k (± 0.02%) +1,833k (+ 0.05%) 3,803,702k 3,806,861k p=0.009 n=12
Memory Allocs 77,159,402 (± 0.09%) 77,407,594 (± 0.08%) +248,192 (+ 0.32%) 77,159,567 77,581,993 p=0.000 n=12
Config Time 0.060s (± 0.41%) 0.060s (± 0.47%) ~ 0.060s 0.061s p=1.000 n=12
Parse Time 1.021s (± 1.79%) 1.001s (± 2.80%) ~ 0.952s 1.104s p=0.062 n=12
Bind Time 0.324s (±13.05%) 0.362s (±10.79%) ~ 0.267s 0.451s p=0.139 n=12
Check Time 14.958s (± 0.78%) 14.787s (± 0.47%) -0.171s (- 1.14%) 14.657s 15.023s p=0.012 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 16.443s (± 0.65%) 16.293s (± 0.48%) -0.150s (- 0.91%) 16.128s 16.594s p=0.017 n=12
social-app - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 2,568,629 2,568,629 ~ ~ ~ p=1.000 n=12
Types 1,163,035 1,163,035 ~ ~ ~ p=1.000 n=12
Memory Used 1,213,017k (± 0.01%) 1,213,026k (± 0.01%) ~ 1,212,644k 1,213,526k p=0.977 n=12
Memory Allocs 13,980,169 (± 0.13%) 14,004,998 (± 0.13%) ~ 13,955,487 14,076,952 p=0.060 n=12
Config Time 0.017s (± 1.65%) 0.017s ~ ~ ~ p=0.217 n=12
Parse Time 0.349s (± 1.96%) 0.349s (± 2.13%) ~ 0.325s 0.374s p=0.966 n=12
Bind Time 0.082s (±13.78%) 0.081s (±14.36%) ~ 0.070s 0.139s p=0.898 n=12
Check Time 3.626s (± 0.46%) 3.557s (± 0.36%) -0.069s (- 1.90%) 3.520s 3.586s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 4.098s (± 0.59%) 4.026s (± 0.42%) -0.072s (- 1.76%) 3.976s 4.070s p=0.000 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,388,680 1,388,680 ~ ~ ~ p=1.000 n=12
Types 441,862 441,862 ~ ~ ~ p=1.000 n=12
Memory Used 1,312,271k (± 0.64%) 1,310,666k (± 0.54%) ~ 1,291,153k 1,330,310k p=0.977 n=12
Memory Allocs 78,193,067 (± 0.09%) 78,240,399 (± 0.13%) ~ 77,902,734 78,423,805 p=0.198 n=12
Config Time 0.004s (±11.30%) 0.005s (±18.62%) ~ 0.004s 0.009s p=0.169 n=12
Parse Time 0.306s (± 3.17%) 0.311s (± 2.07%) ~ 0.295s 0.329s p=0.541 n=12
Bind Time 0.000s (±167.50%) 0.000s (±217.90%) ~ 0.000s 0.001s p=0.739 n=12
Check Time 2.014s (± 0.65%) 1.996s (± 0.68%) -0.018s (- 0.89%) 1.963s 2.031s p=0.034 n=12
Emit Time 0.354s (± 2.89%) 0.358s (± 3.46%) ~ 0.330s 0.401s p=0.369 n=12
Total Time 23.856s (± 0.54%) 23.801s (± 0.63%) ~ 23.457s 24.115s p=0.590 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 247,523k (± 0.03%) 247,642k (± 0.03%) +119k (+ 0.05%) 247,432k 247,795k p=0.028 n=12
Memory Allocs 4,329,877 (± 0.01%) 4,334,872 (± 0.02%) +4,994 (+ 0.12%) 4,333,250 4,336,444 p=0.000 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.115s (± 5.15%) 0.111s (± 4.13%) ~ 0.100s 0.122s p=0.202 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 0.966s (± 0.74%) 0.956s (± 0.61%) ~ 0.938s 0.967s p=0.066 n=12
Emit Time 0.149s (± 5.90%) 0.144s (± 8.93%) ~ 0.101s 0.164s p=0.680 n=12
Total Time 1.287s (± 1.05%) 1.268s (± 1.11%) -0.019s (- 1.50%) 1.222s 1.307s p=0.034 n=12
t3code-server - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 11,588,087 11,588,087 ~ ~ ~ p=1.000 n=12
Types 3,062,556 3,062,556 ~ ~ ~ p=1.000 n=12
Memory Used 3,946,155k (± 0.02%) 3,947,673k (± 0.02%) +1,518k (+ 0.04%) 3,945,875k 3,949,092k p=0.010 n=12
Memory Allocs 41,560,483 (± 0.05%) 42,056,076 (± 0.03%) +495,593 (+ 1.19%) 42,018,726 42,082,165 p=0.000 n=12
Config Time 0.006s 0.006s ~ ~ ~ p=1.000 n=12
Parse Time 0.571s (± 2.71%) 0.552s (± 2.33%) ~ 0.522s 0.582s p=0.066 n=12
Bind Time 0.177s (±13.21%) 0.196s (±15.50%) ~ 0.150s 0.277s p=0.522 n=12
Check Time 18.606s (± 0.19%) 17.640s (± 0.24%) 🟩-0.966s (- 5.19%) 17.499s 17.745s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 19.377s (± 0.14%) 18.413s (± 0.23%) 🟩-0.963s (- 4.97%) 18.238s 18.494s 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 215,259k (± 0.02%) 215,285k (± 0.03%) ~ 215,135k 215,417k p=0.410 n=12
Memory Allocs 1,401,544 (± 0.01%) 1,407,609 (± 0.01%) +6,065 (+ 0.43%) 1,407,209 1,408,179 p=0.000 n=12
Config Time 0.000s (±217.90%) 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.095s (± 4.23%) 0.095s (± 4.70%) ~ 0.086s 0.108s p=0.831 n=12
Bind Time 0.042s (± 7.76%) 0.043s (± 6.50%) ~ 0.038s 0.052s p=0.721 n=12
Check Time 0.744s (± 0.71%) 0.737s (± 0.79%) ~ 0.724s 0.754s p=0.085 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.896s (± 0.40%) 0.890s (± 0.62%) ~ 0.878s 0.906s p=0.116 n=12
vscode - native
Errors 398 398 ~ ~ ~ p=1.000 n=12
Symbols 12,486,816 12,486,816 ~ ~ ~ p=1.000 n=12
Types 4,082,751 4,082,751 ~ ~ ~ p=1.000 n=12
Memory Used 5,850,758k (± 0.02%) 5,851,575k (± 0.02%) ~ 5,848,899k 5,854,596k p=0.266 n=12
Memory Allocs 59,542,300 (± 0.01%) 59,940,991 (± 0.01%) +398,690 (+ 0.67%) 59,933,544 59,953,057 p=0.000 n=12
Config Time 0.076s (± 0.50%) 0.076s (± 0.41%) ~ 0.075s 0.076s p=0.278 n=12
Parse Time 1.859s (± 2.95%) 1.867s (± 2.48%) ~ 1.750s 1.970s p=0.920 n=12
Bind Time 0.652s (±17.20%) 0.624s (±16.55%) ~ 0.512s 0.912s p=0.899 n=12
Check Time 16.646s (± 1.20%) 14.716s (± 0.84%) 🟩-1.931s (-11.60%) 14.383s 14.892s p=0.000 n=12
Emit Time 5.575s (± 3.90%) 5.601s (± 4.77%) ~ 4.831s 6.520s p=1.000 n=12
Total Time 24.893s (± 0.61%) 22.967s (± 0.97%) 🟩-1.926s (- 7.74%) 22.321s 23.762s p=0.000 n=12
webpack - native
Errors 598 598 ~ ~ ~ p=1.000 n=12
Symbols 1,343,495 1,343,495 ~ ~ ~ p=1.000 n=12
Types 651,491 651,491 ~ ~ ~ p=1.000 n=12
Memory Used 855,319k (± 0.02%) 855,411k (± 0.02%) ~ 854,863k 855,814k p=0.514 n=12
Memory Allocs 6,769,540 (± 0.02%) 6,785,782 (± 0.03%) +16,241 (+ 0.24%) 6,782,520 6,792,218 p=0.000 n=12
Config Time 0.009s 0.009s ~ ~ ~ p=1.000 n=12
Parse Time 0.307s (± 3.92%) 0.310s (± 3.69%) ~ 0.280s 0.332s p=0.640 n=12
Bind Time 0.073s (± 4.05%) 0.075s (± 4.37%) ~ 0.068s 0.088s p=0.190 n=12
Check Time 2.783s (± 0.30%) 2.704s (± 0.33%) -0.080s (- 2.86%) 2.687s 2.742s p=0.000 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 3.209s (± 0.47%) 3.134s (± 0.36%) -0.075s (- 2.34%) 3.099s 3.153s p=0.000 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,060,810 1,060,810 ~ ~ ~ p=1.000 n=12
Types 389,671 389,671 ~ ~ ~ p=1.000 n=12
Memory Used 471,794k (± 0.02%) 472,713k (± 0.03%) +919k (+ 0.19%) 472,223k 473,173k p=0.000 n=12
Memory Allocs 4,217,940 (± 0.11%) 4,245,999 (± 0.08%) +28,059 (+ 0.67%) 4,235,542 4,257,008 p=0.000 n=12
Config Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Parse Time 0.106s (± 3.84%) 0.105s (± 2.62%) ~ 0.098s 0.111s p=0.966 n=12
Bind Time 0.035s (±14.42%) 0.035s (±13.13%) ~ 0.026s 0.050s p=0.767 n=12
Check Time 0.911s (± 0.91%) 0.911s (± 0.78%) ~ 0.900s 0.937s p=0.943 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.062s (± 0.94%) 1.062s (± 0.61%) ~ 1.043s 1.081s p=0.701 n=12
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • arktype - native
  • mui-docs - native
  • sentry - native
  • social-app - native
  • strada-build-src - native
  • strada-compiler - native
  • t3code-server - 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

@frivanco97-cmd

Copy link
Copy Markdown

Repositorios..

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

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