Skip to content

Various memory optimizations - #64734

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

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

Conversation

@jakebailey

Copy link
Copy Markdown
Member

No description provided.

Replace nine nodeData interface methods with generated Kind-switch dispatchers to reduce interface method promotion and itab size.
Replace large sparse Kind switches with byte-indexed dispatch tables
and dense switches, while leaving small switches unchanged. Keep the
concrete calls visible to escape analysis without restoring promoted
interface methods.

Add accessor correctness tests and fixture-based benchmarks covering
both mixed nodes and nodes with populated accessor results.
Index generated accessor tables directly with the node kind. Invalid
kinds now hit the normal Go bounds check rather than returning nil.
Update accessor tests to use valid constructed nodes.
…patch-opt

# Conflicts:
#	tsc/internal/ast/kind_stringer_generated.go
Keep the accessor benchmarks compatible with the rooted path types
and filesystem case sensitivity API now used on main.
Each type carries a self-referential interface solely to recover its
concrete representation. That costs space in every type and adds GC
pointer work even though the representation is fixed at construction.

A compact concrete-kind tag saves 16 bytes per type on 64-bit hosts.
Keep it separate from mutable semantic flags so casts stay valid as
checking discovers more information.
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.
Common type representations create many small heap objects during
checking, adding allocator and GC bookkeeping costs.

Use the existing bounded typed arenas for frequently allocated types.
Unlike an arena that owns the entire graph, old blocks can still be
reclaimed when no live type references them.
Large type lists repeatedly grow temporary hash buffers even though
 their encoded length is already known. These discarded allocations
 account for a substantial part of checker allocation traffic.

 Reserve enough capacity before writing each list, retaining the small
 inline path and the exact existing hash byte stream. Allocation tests
 cover the inline boundary and large lists, and a fresh-program benchmark
 includes parsing and binding rather than relying only on warmed ASTs.

 CPU wall timings are noisy on this machine; report bytes and allocation
 counts instead.

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                    │ key-before.txt │            key-reserve.txt            │
                    │      B/op      │     B/op      vs base                 │
TypeListKey/8-20        0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
TypeListKey/46-20       0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
TypeListKey/47-20       576.0 ± 0%       208.0 ± 0%  -63.89% (p=0.002 n=6)
TypeListKey/256-20    2.375Ki ± 0%     1.125Ki ± 0%  -52.63% (p=0.002 n=6)
TypeListKey/4096-20   81.25Ki ± 0%     18.00Ki ± 0%  -77.85% (p=0.002 n=6)
geomean                            ²                 -48.03%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                    │ key-before.txt │           key-reserve.txt           │
                    │   allocs/op    │ allocs/op   vs base                 │
TypeListKey/8-20        0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
TypeListKey/46-20       0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
TypeListKey/47-20       2.000 ± 0%     1.000 ± 0%  -50.00% (p=0.002 n=6)
TypeListKey/256-20      4.000 ± 0%     1.000 ± 0%  -75.00% (p=0.002 n=6)
TypeListKey/4096-20    13.000 ± 0%     1.000 ± 0%  -92.31% (p=0.002 n=6)
geomean                            ²               -60.50%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean
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 linter rewrites integer formatting calls without updating their
imports. Keep the corrected test code buildable with strconv.
Union and intersection normalization creates temporary lists even when
an equivalent type already exists. Mapping and narrowing repeat this work
throughout checking, producing unnecessary garbage. Reentrant, bounded
workspaces let canonicalization reuse that storage while published types
and subtype-reduction caches retain independently owned constituents.

Fresh parse, bind, and check of the compiler fixture (six samples):

                     │ before │             after              │
                     │  B/op  │    B/op       vs base          │
CheckFreshProgram-20 303.0Mi    277.2Mi      -8.51% (p=0.002 n=6)

                     │ before │             after              │
                     │ allocs/op │ allocs/op   vs base         │
CheckFreshProgram-20   1.393M       1.139M   -18.26% (p=0.002 n=6)

VS Code src: identical diagnostics and compiler counts, 31.01M to 28.52M
allocations. One fixed-work instruction sample fell from 344.57B to
324.08B; timing is noisy and not evidence of a reliable wall-time gain.
Retained memory was effectively unchanged at 5.38 GiB.

npx hereby validate passed; focused ownership tests also passed with race
and checkptr instrumentation.
Every mapper currently carries a self-referential interface, and each
inference context separately allocates two mappers with the same lifetime.
A concrete kind header eliminates the interface and lets inference
contexts own their fixing and non-fixing mappers in one allocation.

Fresh parse, bind, and check versus reusable normalization workspaces:

                     │ before │             after              │
                     │  B/op  │    B/op       vs base          │
CheckFreshProgram-20 277.2Mi    276.0Mi      -0.44% (p=0.002 n=6)

                     │ before │             after              │
                     │ allocs/op │ allocs/op   vs base         │
CheckFreshProgram-20   1.139M       1.094M    -3.90% (p=0.002 n=6)

VS Code allocations decrease from 28.52M to 27.17M with identical
compiler counts and diagnostics. Retained memory is effectively unchanged.
Three interleaved fixture runs show fewer fixed-work instructions, but a
single VS Code run is noisy; no wall-time claim is made.

npx hereby validate and focused race/checkptr tests passed.
Most value symbols never need write types, computed names, or containing
types. These three pointers nevertheless occupy every checker link record,
which is the largest retained allocation on the VS Code workload.
Allocate that metadata only when it is used, shrinking the hot record
from 56 to 40 bytes without changing symbol identity or cache semantics.

VS Code src, six samples versus compact inference mappers:

                   │ before  │             after              │
                   │ retained-B │ retained-B   vs base        │
ExternalProgram-20   5.029Gi       4.874Gi   -3.09% (p=0.002 n=6)

                   │ before  │             after              │
                   │ scan-B  │   scan-B       vs base         │
ExternalProgram-20  4.664Gi       4.508Gi    -3.33% (p=0.002 n=6)

                   │ before  │             after              │
                   │ B/op    │   B/op         vs base         │
ExternalProgram-20  6.200Gi       6.043Gi    -2.54% (p=0.002 n=6)

Allocation count is unchanged. All 321 semantic diagnostics and all
10284 files are identical. CLI diagnostic text and compiler counts match
exactly as well. No GC tuning is used.

npx hereby validate and focused race/checkptr ownership tests passed.
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.

npx hereby validate and focused race/checkptr tests passed. Existing
compiler and editor baselines are unchanged, including recursive CommonJS
member resolution.
@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

Bring in the existing nodeData dispatch work before changing AST storage. Keep subsequent representation changes in separate normal commits.
@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

Every node retains a self-referential interface even though its concrete
allocation embeds the node header and its kind already selects dispatch.
Across the VS Code source tree, that redundant metadata keeps hundreds
of megabytes live and exposes another pointer per node to the collector.

Remove the redundant reference without compressing parent or child
pointers. The node header shrinks from 48 to 32 bytes on amd64, while
generated casts check the concrete kind and enforce offset-zero embedding
at compile time. Direct pointers preserve cheap navigation and do not
introduce factory-wide ownership or cross-factory lookup tables.

Baseline: 70510c0, which already includes the existing generated
nodeData accessor work and all preceding checker optimizations.
These numbers do not attribute the accessor foundation's gains to this
change. VS Code src, six interleaved fresh-process samples:

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

                   │ vscode-direct-node-foundation.txt │       vscode-direct-node.txt       │
                   │              scan-B               │    scan-B     vs base              │
ExternalProgram-20                        4.063Gi ± 0%   3.738Gi ± 0%  -8.00% (p=0.002 n=6)

                   │ vscode-direct-node-foundation.txt │       vscode-direct-node.txt       │
                   │               B/op                │     B/op      vs base              │
ExternalProgram-20                        5.983Gi ± 0%   5.659Gi ± 0%  -5.41% (p=0.002 n=6)

                   │ vscode-direct-node-foundation.txt │    vscode-direct-node.txt    │
                   │             allocs/op             │  allocs/op   vs base         │
ExternalProgram-20                         26.04M ± 0%   26.05M ± 0%  ~ (p=0.589 n=6)
                   │ direct-node-foundation-instructions.txt │   direct-node-instructions.txt   │
                   │             instructions/op             │ instructions/op  vs base         │
ExternalProgram-20                               315.0G ± 5%       302.7G ± 4%  ~ (p=0.132 n=6)

Instruction counts are statistically inconclusive on this noisy machine.
All 321 semantic diagnostics and 10284 files are unchanged. CLI diagnostic
text and symbol, type, and instantiation counts match exactly.
No GC settings are changed.

npx hereby validate --all passed. Compiler and editor baselines remain
unchanged. Focused race/checkptr checks cover layout, wrong-kind casts,
canonical token representations, shared kinds, cloning, and GC reachability.
@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

Most symbols do not need members, exports, or an export-symbol link.
Keeping all three pointers in every symbol's shared metadata charges
every property, parameter, and synthetic symbol for those features.

Move them into optional shared metadata, reducing SymbolWithData from
104 to 88 bytes on amd64. Binder- and checker-owned typed arenas batch
the sidecars without adding an allocator pointer to every symbol.
Shared symbolData still sees sidecars created through either alias.

Compared with 823a64b, which already includes the checker storage
and direct-header AST changes. Six fresh-process interleaved samples
parse, bind, and check ../vscode/src with the same single checker and
normal GC settings. Both workloads report 321 diagnostics, 10284 files.
Exact CLI diagnostics and compiler counts also match.

CPU timings are noisy. Hardware instructions and allocation counts
show no statistically established difference; do not claim CPU gains.

Validation: npx hereby validate --all passed. Focused symbol tests
also passed with -race and -gcflags=all=-d=checkptr=2.

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

                   │ vscode-symbol-batched-before.txt │     vscode-symbol-batched.txt      │
                   │              scan-B              │    scan-B     vs base              │
ExternalProgram-20                       3.738Gi ± 0%   3.687Gi ± 0%  -1.34% (p=0.002 n=6)

                   │ vscode-symbol-batched-before.txt │     vscode-symbol-batched.txt      │
                   │               B/op               │     B/op      vs base              │
ExternalProgram-20                       5.659Gi ± 2%   5.606Gi ± 0%  -0.93% (p=0.002 n=6)

                   │ vscode-symbol-batched-before.txt │  vscode-symbol-batched.txt   │
                   │            allocs/op             │  allocs/op   vs base         │
ExternalProgram-20                        26.06M ± 2%   26.08M ± 0%  ~ (p=0.310 n=6)

                        │ symbol-batched-before-instructions.txt │ symbol-batched-instructions.txt  │
                        │            instructions/op             │ instructions/op  vs base         │
ExternalInstructions-20                              302.1G ± 4%       299.9G ± 3%  ~ (p=0.589 n=6)
Avoiding unused instantiated members complements cheaper retained
symbols and indexes, but both approaches eliminate some of the same
storage. Measure their combined effect rather than adding percentages
from independent upstream comparisons.

Layer local unified-member-resolution at d52b33f onto 7990e68.
Partial resolution keeps its selective cache. Fully enumerated types
publish compact member indexes, preserving provisional visibility for
recursive filtering and live module tables. Adapt setter checks to
the cold value-symbol link accessor. Extend identity coverage beyond
the small-table linear-scan threshold.

Six fresh-process interleaved samples parse, bind, and check the actual
VS Code src/tsconfig.json with one checker and normal GC settings.
The baseline already includes the checker, AST, and symbol reductions.
Live heap falls another 4.16%, GC scan bytes fall 3.65%, and checker
symbol creation falls 34.94%. Allocated bytes fall only 0.53%, while
allocation events rise 4.88%; this remains a real tradeoff.

Neither elapsed time nor hardware instructions differs significantly.
Both variants report 321 diagnostics and 10284 files. The production
CLI diagnostic text is byte-identical, including its expected exit 2.

Validation passed:
  npx hereby test
  npx hereby validate --all
  go -C tsc test -race -gcflags=all=-d=checkptr=2 ./internal/checker
    -run 'TestInstantiated|TestMemberIndex' -count=1

Task-only measurement helpers are not included.

Exact benchstat output:

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-unified-on-compact-before.txt │ vscode-unified-on-compact.txt │
                   │                sec/op                │    sec/op     vs base         │
ExternalProgram-20                             38.32 ± 9%     38.76 ± 8%  ~ (p=0.699 n=6)

                   │ vscode-unified-on-compact-before.txt │ vscode-unified-on-compact.txt  │
                   │             diagnostics              │ diagnostics  vs base           │
ExternalProgram-20                             321.0 ± 0%    321.0 ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-unified-on-compact-before.txt │ vscode-unified-on-compact.txt  │
                   │                files                 │    files     vs base           │
ExternalProgram-20                            10.28k ± 0%   10.28k ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-unified-on-compact-before.txt │   vscode-unified-on-compact.txt    │
                   │              retained-B              │  retained-B   vs base              │
ExternalProgram-20                           4.130Gi ± 0%   3.958Gi ± 0%  -4.16% (p=0.002 n=6)

                   │ vscode-unified-on-compact-before.txt │   vscode-unified-on-compact.txt    │
                   │                scan-B                │    scan-B     vs base              │
ExternalProgram-20                           3.688Gi ± 0%   3.553Gi ± 0%  -3.65% (p=0.002 n=6)

                   │ vscode-unified-on-compact-before.txt │   vscode-unified-on-compact.txt    │
                   │               symbols                │   symbols    vs base               │
ExternalProgram-20                            6.385M ± 0%   4.154M ± 0%  -34.94% (p=0.002 n=6)

                   │ vscode-unified-on-compact-before.txt │   vscode-unified-on-compact.txt    │
                   │                 B/op                 │     B/op      vs base              │
ExternalProgram-20                           5.606Gi ± 0%   5.576Gi ± 0%  -0.53% (p=0.002 n=6)

                   │ vscode-unified-on-compact-before.txt │   vscode-unified-on-compact.txt   │
                   │              allocs/op               │  allocs/op   vs base              │
ExternalProgram-20                            26.07M ± 0%   27.35M ± 0%  +4.88% (p=0.002 n=6)

                        │ unified-on-compact-before-instructions.txt │ unified-on-compact-instructions.txt │
                        │              instructions/op               │  instructions/op    vs base         │
ExternalInstructions-20                                  290.9G ± 5%          301.4G ± 5%  ~ (p=0.589 n=6)
@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

Every object, union, and intersection paid for signature and index-info
slice headers, a call-signature count, and a node-builder cache, even
when none were needed. Those fields made StructuredType 144 bytes on
amd64. Keep them in an optional checker-arena sidecar and reduce the
hot record to 88 bytes.

Preserve signature publication during recursive anonymous resolution,
clipped public signature slices, index-info nil/empty distinctions,
and independent node-builder cache identity. Empty unresolved shape
does not allocate a sidecar.

Compared with 1ef0b40, including unified member resolution and all
previous checker, AST, and symbol reductions. Six fresh-process
interleaved samples parse, bind, and check the actual VS Code project
using one checker and normal GC settings.

Live heap falls another 1.81%, GC scan bytes fall 2.01%, and allocated
bytes fall 1.28%. Allocation counts do not differ significantly.
Neither hardware instructions nor elapsed time establishes a change;
this does not claim a CPU improvement.

Exact CLI diagnostic text and compiler counts match the baseline.
Validation passed: npx hereby validate --all, plus focused checker
tests with -race and -gcflags=all=-d=checkptr=2.

Exact benchstat output:

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-shape-before.txt │       vscode-shape.txt       │
                   │         sec/op          │   sec/op     vs base         │
ExternalProgram-20                41.55 ± 6%   41.84 ± 13%  ~ (p=0.937 n=6)

                   │ vscode-shape-before.txt │        vscode-shape.txt        │
                   │       diagnostics       │ diagnostics  vs base           │
ExternalProgram-20                321.0 ± 0%    321.0 ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-shape-before.txt │        vscode-shape.txt        │
                   │          files          │    files     vs base           │
ExternalProgram-20               10.28k ± 0%   10.28k ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-shape-before.txt │          vscode-shape.txt          │
                   │       retained-B        │  retained-B   vs base              │
ExternalProgram-20              3.959Gi ± 0%   3.887Gi ± 0%  -1.81% (p=0.002 n=6)

                   │ vscode-shape-before.txt │          vscode-shape.txt          │
                   │         scan-B          │    scan-B     vs base              │
ExternalProgram-20              3.553Gi ± 0%   3.482Gi ± 0%  -2.01% (p=0.002 n=6)

                   │ vscode-shape-before.txt │        vscode-shape.txt        │
                   │         symbols         │   symbols    vs base           │
ExternalProgram-20               4.154M ± 0%   4.154M ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-shape-before.txt │          vscode-shape.txt          │
                   │          B/op           │     B/op      vs base              │
ExternalProgram-20              5.577Gi ± 0%   5.506Gi ± 0%  -1.28% (p=0.002 n=6)

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

                        │ shape-before-instructions.txt │      shape-instructions.txt      │
                        │        instructions/op        │ instructions/op  vs base         │
ExternalInstructions-20                     292.5G ± 4%       301.6G ± 4%  ~ (p=0.093 n=6)
@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

One function-or-constructor check flag padded every value-symbol link
to 40 bytes on amd64, including links for ordinary properties and
parameters. Store it in the existing optional metadata instead, making
the hot record 32 bytes. The guard is still published before checking
the symbol so recursive and repeated checks retain their behavior.

Compared with da5b50e, which includes all preceding checker, AST,
symbol, unified-member, and structured-shape changes. Six fresh-process
interleaved samples parse, bind, and check the actual VS Code project
using one checker and normal GC settings.

Live heap falls another 0.61%, GC scan bytes fall 0.68%, and allocated
bytes fall 0.45%. Allocation events, elapsed time, and instructions
have no statistically established difference.

Exact production CLI diagnostic text and compiler counts match.
Validation passed: npx hereby validate --all, and focused checker
tests with -race and -gcflags=all=-d=checkptr=2.

Exact benchstat output:

goos: linux
goarch: amd64
pkg: github.com/microsoft/TypeScript/tsc/internal/checker
cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz
                   │ vscode-linkflags-before.txt │    vscode-linkflags.txt     │
                   │           sec/op            │   sec/op    vs base         │
ExternalProgram-20                   40.92 ± 11%   40.69 ± 7%  ~ (p=0.589 n=6)

                   │ vscode-linkflags-before.txt │      vscode-linkflags.txt      │
                   │         diagnostics         │ diagnostics  vs base           │
ExternalProgram-20                    321.0 ± 0%    321.0 ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-linkflags-before.txt │      vscode-linkflags.txt      │
                   │            files            │    files     vs base           │
ExternalProgram-20                   10.28k ± 0%   10.28k ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-linkflags-before.txt │        vscode-linkflags.txt        │
                   │         retained-B          │  retained-B   vs base              │
ExternalProgram-20                  3.887Gi ± 0%   3.864Gi ± 0%  -0.61% (p=0.002 n=6)

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

                   │ vscode-linkflags-before.txt │      vscode-linkflags.txt      │
                   │           symbols           │   symbols    vs base           │
ExternalProgram-20                   4.154M ± 0%   4.154M ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                   │ vscode-linkflags-before.txt │        vscode-linkflags.txt        │
                   │            B/op             │     B/op      vs base              │
ExternalProgram-20                  5.506Gi ± 0%   5.481Gi ± 0%  -0.45% (p=0.002 n=6)

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

                        │ linkflags-before-instructions.txt │    linkflags-instructions.txt    │
                        │          instructions/op          │ instructions/op  vs base         │
ExternalInstructions-20                         298.1G ± 3%       301.6G ± 3%  ~ (p=0.310 n=6)
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 1d11625, 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. Compiler,
fourslash, unit, focused race/checkptr tests, and hereby validate --all
pass.
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 efe6e90, 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. Full compiler,
fourslash and unit tests, focused race/checkptr tests, and
npx hereby validate --all pass.

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. Indexed arenas retain their index layout.
No GC settings, cross-file pooling, or pointer decoding are introduced.

Six fresh-process interleaved VS Code comparisons against 69d9821,
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.
Focused race/checkptr checks and npx hereby validate --all pass, including
166152 Go tests and 954 API tests. 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)
@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

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 e97c4aa,
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. The full
compiler, fourslash, and unit suite passes, as do focused race/checkptr
checks for 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)
@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

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 27786ef,
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. Focused race/checkptr checks and npx hereby validate --all
pass, including 166156 Go tests and 954 API tests. 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)
@jakebailey

Copy link
Copy Markdown
Member Author

CPU regression appears to be due to #64735

Full enumeration was repeating name lookups and base traversal that lazy
resolution needs but enumeration has already done. This overhead
appeared in the MUI and Webpack regressions after unified resolution.
Preserve its selective-lookup symbol and heap savings without paying the
same lookup costs while collecting all properties.

Six fresh-process interleaved production CLI comparisons against
5f35280, with normal GC and default threading, reduce instructions
2.55% on CI-pinned MUI and 2.17% on Xstate. Webpack and VS Code
instruction differences are inconclusive. Allocations decrease on all
four workloads.
Reported heap is unchanged except for a 0.12% increase on Xstate.

Against main aa81492, the combined branch uses 9.74-15.75% fewer
instructions and 23.11-31.55% less reported heap across these workloads.
These comparisons include all earlier optimizations on the branch.

MUI uses source and dependencies from the benchmark's CI-pinned commit
6780195595c12252a130aa5ae5c5bd461229c6b7. Webpack is isolated at
2289141381f2c1c965cb65118fa0ffe2e9e19834 with scenario dependencies
restored. VS Code uses 8bf178e1e1c2be3723f14683f7b1e5fdb3f780e4.
Xstate uses cc087bf52cbe5cc291146816e7ef530bc53698a0 and its existing
partial dependency installation. Existing workload diagnostics match
exactly across main, before, and after; candidate semantic counts match
before, including symbol counts.

MUI check time improves 10.85% in these samples, but the shared host is
noisy. No check-time difference against main is significant. This is not
evidence that the hosted CI timing regression has been eliminated.
heap-B/op is CLI-reported heap, not a forced-GC retained-heap measure.

Cached and uncached declared/inherited enumeration, identity, ordering,
negative lookups, unaffected snapshots, renamed keys, and diamond bases
pass focused tests with race/checkptr. npx hereby validate --all passes,
including 166161 Go tests and 954 API tests.

Before and after this change:
              │   before.txt    │               after.txt               │
              │ instructions/op │ instructions/op  vs base              │
mui-pinned-20       293.6G ± 2%       286.1G ± 2%  -2.55% (p=0.002 n=6)
webpack-20          53.35G ± 2%       52.12G ± 3%       ~ (p=0.065 n=6)
xstate-20           20.56G ± 2%       20.11G ± 1%  -2.17% (p=0.015 n=6)
vscode-20           300.9G ± 5%       301.5G ± 3%       ~ (p=1.000 n=6)
geomean             99.21G            97.52G       -1.71%

              │  before.txt  │             after.txt              │
              │  heap-B/op   │  heap-B/op    vs base              │
mui-pinned-20   2.061Gi ± 0%   2.061Gi ± 0%       ~ (p=0.394 n=6)
webpack-20      666.6Mi ± 0%   666.7Mi ± 0%       ~ (p=0.240 n=6)
xstate-20       274.9Mi ± 0%   275.3Mi ± 0%  +0.12% (p=0.002 n=6)
vscode-20       2.834Gi ± 0%   2.833Gi ± 0%       ~ (p=0.485 n=6)
geomean         1.005Gi        1.005Gi       +0.02%

              │ before.txt  │             after.txt             │
              │  allocs/op  │  allocs/op   vs base              │
mui-pinned-20   29.96M ± 0%   29.86M ± 0%  -0.34% (p=0.026 n=6)
webpack-20      6.287M ± 0%   6.238M ± 0%  -0.78% (p=0.002 n=6)
xstate-20       3.394M ± 0%   3.371M ± 0%  -0.68% (p=0.002 n=6)
vscode-20       36.92M ± 0%   36.67M ± 0%  -0.68% (p=0.002 n=6)
geomean         12.39M        12.32M       -0.62%

              │  before.txt  │              after.txt              │
              │ check-sec/op │ check-sec/op  vs base               │
mui-pinned-20   10.155 ± 27%    9.053 ± 12%  -10.85% (p=0.041 n=6)
webpack-20       1.844 ±  9%    1.743 ± 12%        ~ (p=0.258 n=6)
xstate-20       915.5m ±  9%   926.0m ±  9%        ~ (p=1.000 n=6)
vscode-20        7.689 ±  5%    7.549 ± 14%        ~ (p=0.818 n=6)
geomean          3.388          3.240         -4.36%
              │    main.txt     │               after.txt                │
              │ instructions/op │ instructions/op  vs base               │
mui-pinned-20      317.0G ±  6%       286.1G ± 2%   -9.74% (p=0.002 n=6)
webpack-20         58.36G ±  9%       52.12G ± 3%  -10.68% (p=0.002 n=6)
xstate-20          23.45G ±  8%       20.11G ± 1%  -14.23% (p=0.002 n=6)
vscode-20          357.8G ± 10%       301.5G ± 3%  -15.75% (p=0.002 n=6)
geomean            111.6G             97.52G       -12.63%

              │   main.txt   │              after.txt              │
              │  heap-B/op   │  heap-B/op    vs base               │
mui-pinned-20   2.680Gi ± 0%   2.061Gi ± 0%  -23.11% (p=0.002 n=6)
webpack-20      915.2Mi ± 0%   666.7Mi ± 0%  -27.15% (p=0.002 n=6)
xstate-20       393.7Mi ± 0%   275.3Mi ± 0%  -30.09% (p=0.002 n=6)
vscode-20       4.138Gi ± 0%   2.833Gi ± 0%  -31.55% (p=0.002 n=6)
geomean         1.397Gi        1.005Gi       -28.05%

              │  main.txt   │             after.txt              │
              │  allocs/op  │  allocs/op   vs base               │
mui-pinned-20   32.84M ± 0%   29.86M ± 0%   -9.07% (p=0.002 n=6)
webpack-20      6.586M ± 0%   6.238M ± 0%   -5.29% (p=0.002 n=6)
xstate-20       3.804M ± 0%   3.371M ± 0%  -11.39% (p=0.002 n=6)
vscode-20       36.87M ± 0%   36.67M ± 0%   -0.57% (p=0.002 n=6)
geomean         13.20M        12.32M        -6.67%

              │   main.txt   │             after.txt              │
              │ check-sec/op │ check-sec/op  vs base              │
mui-pinned-20    9.032 ± 13%    9.053 ± 12%       ~ (p=1.000 n=6)
webpack-20       1.740 ±  8%    1.743 ± 12%       ~ (p=1.000 n=6)
xstate-20       985.5m ± 18%   926.0m ±  9%       ~ (p=0.180 n=6)
vscode-20        8.076 ± 10%    7.549 ± 14%       ~ (p=0.240 n=6)
geomean          3.344          3.240        -3.09%
@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

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.

1 participant