Skip to content

Avoid re-sorting spread members from scratch - #64945

Closed
Jake Bailey (jakebailey) wants to merge 1 commit into
microsoft:mainfrom
jakebailey:perf/incremental-spread-sort
Closed

Jake Bailey (jakebailey) wants to merge 1 commit into
microsoft:mainfrom
jakebailey:perf/incremental-spread-sort

Conversation

@jakebailey

Copy link
Copy Markdown
Member

this is a bit sloppy, but I want to run perf

Every object spread builds a member table and sorts its properties by
declaration. Chains such as `{ ...a, x, ...b, y }` re-sort the whole
accumulated set at each step, and each comparison walked the parent
chain of both declarations to find their files. On mui-docs this sort
was about 6% of single-checker time.

Compute each symbol's sort key once, sort already-sorted input and
two sorted runs in linear time, and have spreads list their members
in the order of the two (already sorted) property lists. The sorted
result is the same; only the work to get there changes.

Single-checker check time on mui-docs, five runs each:
  before  9.004s 9.103s 9.114s 9.157s 9.207s
  after   8.826s 8.879s 8.940s 8.943s 9.032s

                  │  old.txt   │             new.txt              │
                  │   sec/op   │   sec/op    vs base              │
Tsc/bluesky         2.385 ± 5%   2.350 ± 7%       ~ (p=0.394 n=6)
Tsc/sentry          10.11 ± 3%   10.07 ± 2%       ~ (p=0.699 n=6)
Tsc/t3code-server   8.042 ± 4%   7.920 ± 2%       ~ (p=0.240 n=6)
Tsc/mui-docs        6.165 ± 2%   6.105 ± 3%       ~ (p=0.394 n=6)
geomean             5.880        5.816       -1.09%

                  │   old.txt    │              new.txt               │
                  │    rss-B     │    rss-B      vs base              │
Tsc/bluesky         1.175Gi ± 3%   1.176Gi ± 1%       ~ (p=1.000 n=6)
Tsc/sentry          3.365Gi ± 4%   3.438Gi ± 6%       ~ (p=0.132 n=6)
Tsc/t3code-server   2.694Gi ± 8%   2.868Gi ± 7%       ~ (p=0.485 n=6)
Tsc/mui-docs        2.290Gi ± 3%   2.337Gi ± 7%       ~ (p=0.589 n=6)
geomean             2.222Gi        2.281Gi       +2.66%

                  │   old.txt    │              new.txt               │
                  │    heap-B    │    heap-B     vs base              │
Tsc/bluesky         915.3Mi ± 0%   915.1Mi ± 0%       ~ (p=0.180 n=6)
Tsc/sentry          2.481Gi ± 0%   2.482Gi ± 0%       ~ (p=0.065 n=6)
Tsc/t3code-server   2.178Gi ± 0%   2.179Gi ± 0%       ~ (p=0.310 n=6)
Tsc/mui-docs        1.732Gi ± 0%   1.732Gi ± 0%       ~ (p=0.240 n=6)
geomean             1.701Gi        1.701Gi       +0.02%
@typescript-automation typescript-automation Bot added Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug labels Oct 23, 2026
@jakebailey

Copy link
Copy Markdown
Member Author

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

@typescript-automation

typescript-automation Bot commented Oct 23, 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 88,466 88,466 ~ ~ ~ p=1.000 n=12
Types 79,607 79,607 ~ ~ ~ p=1.000 n=12
Memory Used 109,177k (± 0.06%) 109,349k (± 0.06%) +172k (+ 0.16%) 109,228k 109,572k p=0.001 n=12
Memory Allocs 2,196,680 (± 0.01%) 2,196,693 (± 0.00%) ~ 2,196,435 2,197,031 p=0.755 n=12
Config Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.039s (± 2.80%) 0.040s (± 3.25%) ~ 0.036s 0.043s p=0.121 n=12
Bind Time 0.014s (±10.31%) 0.014s (±10.10%) ~ 0.011s 0.018s p=0.923 n=12
Check Time 0.476s (± 0.53%) 0.480s (± 0.62%) +0.004s (+ 0.88%) 0.473s 0.488s p=0.031 n=12
Emit Time 0.267s (± 2.21%) 0.268s (± 2.70%) ~ 0.252s 0.284s p=0.541 n=12
Total Time 0.802s (± 1.06%) 0.810s (± 0.91%) ~ 0.793s 0.830s p=0.147 n=12
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=12
Symbols 586,579 (± 0.01%) 586,600 (± 0.02%) ~ 586,350 586,959 p=0.887 n=12
Types 241,723 (± 0.00%) 241,723 (± 0.00%) ~ 241,721 241,726 p=0.534 n=12
Memory Used 551,241k (± 0.02%) 551,502k (± 0.03%) +261k (+ 0.05%) 551,056k 551,982k p=0.006 n=12
Memory Allocs 13,073,960 (± 0.05%) 13,081,419 (± 0.07%) +7,459 (+ 0.06%) 13,071,731 13,118,577 p=0.008 n=12
Config Time 0.017s (± 1.70%) 0.017s (± 1.45%) ~ 0.016s 0.017s p=1.000 n=12
Parse Time 0.224s (± 3.11%) 0.222s (± 2.90%) ~ 0.210s 0.240s p=0.723 n=12
Bind Time 0.081s (±13.38%) 0.080s (±13.79%) ~ 0.058s 0.113s p=0.943 n=12
Check Time 0s 0s ~ ~ ~ p=1.000 n=12
Emit Time 1.499s (± 1.64%) 1.510s (± 1.68%) ~ 1.443s 1.562s p=0.193 n=12
Total Time 1.840s (± 1.65%) 1.847s (± 1.54%) ~ 1.768s 1.908s p=0.541 n=12
arktype - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 685,943 685,943 ~ ~ ~ p=1.000 n=12
Types 939,496 939,496 ~ ~ ~ p=1.000 n=12
Memory Used 533,313k (± 0.01%) 533,258k (± 0.01%) ~ 533,102k 533,426k p=0.378 n=12
Memory Allocs 12,772,138 (± 0.02%) 12,776,917 (± 0.01%) +4,779 (+ 0.04%) 12,774,343 12,784,798 p=0.013 n=12
Config Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Parse Time 0.072s (± 3.73%) 0.069s (± 4.04%) ~ 0.064s 0.077s p=0.102 n=12
Bind Time 0.020s (± 8.07%) 0.023s (±14.64%) ~ 0.018s 0.033s p=0.342 n=12
Check Time 1.833s (± 0.65%) 1.830s (± 0.77%) ~ 1.797s 1.859s p=0.898 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 1.973s (± 0.58%) 1.974s (± 0.30%) ~ 1.954s 1.986s p=0.854 n=12
mui-docs - native
Errors 11,405 11,405 ~ ~ ~ p=1.000 n=12
Symbols 3,855,253 3,855,253 ~ ~ ~ p=1.000 n=12
Types 1,370,331 1,370,331 ~ ~ ~ p=1.000 n=12
Memory Used 2,309,374k (± 0.07%) 2,308,295k (± 0.04%) ~ 2,305,280k 2,310,594k p=0.219 n=12
Memory Allocs 27,147,272 (± 0.09%) 27,324,714 (± 0.05%) +177,442 (+ 0.65%) 27,296,120 27,359,416 p=0.000 n=12
Config Time 0.017s 0.017s (± 1.86%) ~ 0.016s 0.017s p=0.093 n=12
Parse Time 0.466s (± 4.14%) 0.472s (± 2.37%) ~ 0.446s 0.504s p=0.876 n=12
Bind Time 0.002s (±24.21%) 0.003s (±29.38%) ~ 0.002s 0.005s p=1.000 n=12
Check Time 6.599s (± 0.65%) 6.540s (± 0.76%) -0.059s (- 0.90%) 6.482s 6.671s p=0.008 n=12
Emit Time 0.470s (± 6.96%) 0.452s (± 3.07%) ~ 0.413s 0.466s p=0.356 n=12
Total Time 8.310s (± 0.45%) 8.246s (± 0.57%) -0.065s (- 0.78%) 8.173s 8.371s p=0.023 n=12
sentry - native
Errors 2 2 ~ ~ ~ p=1.000 n=12
Symbols 4,793,345 4,793,345 ~ ~ ~ p=1.000 n=12
Types 2,607,067 2,607,067 ~ ~ ~ p=1.000 n=12
Memory Used 3,206,794k (± 0.03%) 3,206,737k (± 0.04%) ~ 3,204,974k 3,211,346k p=0.932 n=12
Memory Allocs 75,236,033 (± 0.10%) 75,664,356 (± 0.10%) +428,322 (+ 0.57%) 75,408,655 75,797,761 p=0.000 n=12
Config Time 0.060s (± 0.54%) 0.061s (± 0.53%) ~ 0.060s 0.061s p=1.000 n=12
Parse Time 1.010s (± 1.97%) 1.011s (± 1.85%) ~ 0.977s 1.064s p=0.898 n=12
Bind Time 0.328s (±12.44%) 0.319s (± 9.20%) ~ 0.265s 0.410s p=0.854 n=12
Check Time 13.712s (± 0.69%) 13.714s (± 0.54%) ~ 13.598s 13.953s p=0.580 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 15.191s (± 0.68%) 15.187s (± 0.53%) ~ 15.075s 15.498s p=0.640 n=12
social-app - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,883,343 1,883,343 ~ ~ ~ p=1.000 n=12
Types 1,158,474 1,158,474 ~ ~ ~ p=1.000 n=12
Memory Used 1,057,591k (± 0.02%) 1,057,798k (± 0.02%) ~ 1,057,441k 1,058,682k p=0.298 n=12
Memory Allocs 13,572,113 (± 0.12%) 13,639,629 (± 0.17%) +67,516 (+ 0.50%) 13,587,656 13,712,235 p=0.000 n=12
Config Time 0.017s (± 1.65%) 0.017s (± 1.43%) ~ 0.017s 0.018s p=1.000 n=12
Parse Time 0.353s (± 1.92%) 0.354s (± 1.56%) ~ 0.344s 0.372s p=0.723 n=12
Bind Time 0.082s (±10.71%) 0.082s (± 9.43%) ~ 0.073s 0.116s p=0.559 n=12
Check Time 3.296s (± 0.90%) 3.298s (± 0.65%) ~ 3.223s 3.340s p=0.944 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 3.773s (± 0.56%) 3.776s (± 0.37%) ~ 3.745s 3.806s p=0.921 n=12
strada-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 1,184,988 1,184,988 ~ ~ ~ p=1.000 n=12
Types 438,967 438,967 ~ ~ ~ p=1.000 n=12
Memory Used 1,270,722k (± 0.35%) 1,275,154k (± 0.50%) ~ 1,265,577k 1,302,712k p=0.219 n=12
Memory Allocs 77,389,456 (± 0.12%) 77,454,770 (± 0.06%) ~ 77,335,269 77,554,999 p=0.198 n=12
Config Time 0.004s (± 9.45%) 0.004s (±15.55%) ~ 0.002s 0.005s p=0.971 n=12
Parse Time 0.310s (± 2.69%) 0.311s (± 1.74%) ~ 0.300s 0.325s p=0.522 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 1.949s (± 0.70%) 1.958s (± 0.46%) ~ 1.941s 1.987s p=0.235 n=12
Emit Time 0.372s (± 3.60%) 0.374s (± 2.99%) ~ 0.350s 0.409s p=0.810 n=12
Total Time 23.496s (± 0.59%) 23.478s (± 0.54%) ~ 23.184s 23.849s p=0.671 n=12
strada-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 263,525 263,525 ~ ~ ~ p=1.000 n=12
Types 196,118 196,118 ~ ~ ~ p=1.000 n=12
Memory Used 236,042k (± 0.04%) 236,357k (± 0.02%) +315k (+ 0.13%) 236,233k 236,486k p=0.000 n=12
Memory Allocs 4,287,460 (± 0.01%) 4,288,179 (± 0.00%) ~ 4,287,678 4,288,637 p=0.060 n=12
Config Time 0.001s 0.001s ~ ~ ~ p=1.000 n=12
Parse Time 0.110s (± 5.31%) 0.114s (± 4.91%) ~ 0.102s 0.127s p=0.223 n=12
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Check Time 0.942s (± 0.55%) 0.950s (± 0.48%) +0.008s (+ 0.89%) 0.938s 0.962s p=0.016 n=12
Emit Time 0.150s (± 3.56%) 0.145s (± 4.26%) ~ 0.120s 0.158s p=0.091 n=12
Total Time 1.260s (± 0.59%) 1.264s (± 0.76%) ~ 1.230s 1.283s p=0.272 n=12
t3code-server - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 4,350,705 4,350,705 ~ ~ ~ p=1.000 n=12
Types 3,040,691 3,040,691 ~ ~ ~ p=1.000 n=12
Memory Used 2,610,673k (± 0.02%) 2,611,666k (± 0.04%) ~ 2,609,688k 2,615,684k p=0.178 n=12
Memory Allocs 37,331,793 (± 0.03%) 37,450,881 (± 0.05%) +119,088 (+ 0.32%) 37,402,845 37,487,172 p=0.000 n=12
Config Time 0.006s 0.006s ~ ~ ~ p=1.000 n=12
Parse Time 0.566s (± 2.55%) 0.571s (± 3.08%) ~ 0.525s 0.613s p=0.486 n=12
Bind Time 0.178s (±10.38%) 0.188s (±14.42%) ~ 0.148s 0.270s p=0.640 n=12
Check Time 16.341s (± 0.34%) 16.515s (± 0.44%) +0.174s (+ 1.06%) 16.329s 16.692s p=0.001 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 17.109s (± 0.31%) 17.297s (± 0.44%) +0.188s (+ 1.10%) 17.079s 17.478s p=0.000 n=12
ts-pre-modules - native
Errors 87 87 ~ ~ ~ p=1.000 n=12
Symbols 231,636 231,636 ~ ~ ~ p=1.000 n=12
Types 181,196 181,196 ~ ~ ~ p=1.000 n=12
Memory Used 203,549k (± 0.02%) 203,819k (± 0.01%) +270k (+ 0.13%) 203,763k 203,914k p=0.000 n=12
Memory Allocs 1,358,393 (± 0.02%) 1,358,890 (± 0.01%) +497 (+ 0.04%) 1,358,303 1,359,382 p=0.007 n=12
Config Time 0.000s (±217.90%) 0.000s ~ ~ ~ p=1.000 n=12
Parse Time 0.097s (± 3.90%) 0.098s (± 5.08%) ~ 0.087s 0.111s p=0.485 n=12
Bind Time 0.042s (± 6.80%) 0.041s (± 8.00%) ~ 0.032s 0.048s p=0.943 n=12
Check Time 0.721s (± 1.14%) 0.723s (± 0.63%) ~ 0.715s 0.735s p=0.258 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.874s (± 0.94%) 0.878s (± 0.79%) ~ 0.860s 0.899s p=0.385 n=12
vscode - native
Errors 10 10 ~ ~ ~ p=1.000 n=12
Symbols 7,153,364 7,153,364 ~ ~ ~ p=1.000 n=12
Types 4,210,651 4,210,651 ~ ~ ~ p=1.000 n=12
Memory Used 5,339,823k (± 0.02%) 5,338,885k (± 0.01%) ~ 5,338,082k 5,339,940k p=0.060 n=12
Memory Allocs 61,819,850 (± 0.01%) 62,062,380 (± 0.05%) +242,531 (+ 0.39%) 62,042,142 62,201,118 p=0.000 n=12
Config Time 0.079s (± 0.39%) 0.078s (± 0.23%) -0.001s (- 0.74%) 0.078s 0.079s p=0.009 n=12
Parse Time 1.922s (± 2.04%) 1.950s (± 2.30%) ~ 1.861s 2.069s p=0.224 n=12
Bind Time 0.762s (±14.89%) 0.705s (±14.37%) ~ 0.548s 1.001s p=0.410 n=12
Check Time 15.015s (± 1.09%) 15.175s (± 1.19%) ~ 14.782s 15.482s p=0.098 n=12
Emit Time 5.920s (± 9.26%) 5.576s (± 8.83%) ~ 4.944s 6.877s p=0.551 n=12
Total Time 23.782s (± 2.04%) 23.567s (± 1.82%) ~ 22.917s 24.746s p=0.932 n=12
webpack - native
Errors 602 602 ~ ~ ~ p=1.000 n=12
Symbols 916,593 916,593 ~ ~ ~ p=1.000 n=12
Types 643,793 643,793 ~ ~ ~ p=1.000 n=12
Memory Used 765,225k (± 0.02%) 765,331k (± 0.02%) ~ 764,886k 765,615k p=0.101 n=12
Memory Allocs 6,540,306 (± 0.02%) 6,543,682 (± 0.02%) +3,376 (+ 0.05%) 6,541,218 6,547,527 p=0.001 n=12
Config Time 0.009s 0.009s ~ ~ ~ p=1.000 n=12
Parse Time 0.325s (± 1.96%) 0.309s (± 4.80%) ~ 0.266s 0.339s p=0.075 n=12
Bind Time 0.080s (± 5.92%) 0.096s (±13.97%) ~ 0.072s 0.127s p=0.164 n=12
Check Time 2.976s (± 0.30%) 2.982s (± 0.38%) ~ 2.946s 3.006s p=0.213 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 3.430s (± 0.46%) 3.436s (± 0.46%) ~ 3.381s 3.484s p=0.541 n=12
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=12
Symbols 640,566 640,566 ~ ~ ~ p=1.000 n=12
Types 388,220 388,220 ~ ~ ~ p=1.000 n=12
Memory Used 398,636k (± 0.02%) 398,851k (± 0.04%) +214k (+ 0.05%) 398,551k 399,296k p=0.033 n=12
Memory Allocs 3,994,232 (± 0.10%) 4,001,677 (± 0.14%) ~ 3,987,241 4,019,387 p=0.052 n=12
Config Time 0.002s 0.002s ~ ~ ~ p=1.000 n=12
Parse Time 0.107s (± 3.73%) 0.105s (± 3.51%) ~ 0.097s 0.117s p=0.520 n=12
Bind Time 0.032s (±14.10%) 0.039s (±14.31%) ~ 0.026s 0.056s p=0.056 n=12
Check Time 0.791s (± 0.57%) 0.800s (± 0.70%) +0.008s (+ 1.06%) 0.786s 0.819s p=0.021 n=12
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=12
Total Time 0.939s (± 0.64%) 0.955s (± 1.14%) +0.016s (+ 1.69%) 0.927s 0.986s p=0.018 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

@jakebailey

Copy link
Copy Markdown
Member Author

Yeah no

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