Skip to content

Default to GOGC=50#4401

Open
jakebailey wants to merge 1 commit into
mainfrom
jabaile/default-gogc
Open

Default to GOGC=50#4401
jakebailey wants to merge 1 commit into
mainfrom
jabaile/default-gogc

Conversation

@jakebailey

Copy link
Copy Markdown
Member

I had copilot do an analysis of a spread of GOGC values, building an LSP harness and testing it on the old compiler source, and then a tsc run on the old compiler and VS Code. https://gist.github.com/jakebailey/1fb4a89bead2dcef0f51e7a4cbdcdec7

The gist is that GOGC=50 seems to provide a reasonable peak memory savings without too much extra CPU time. Wall time is in general unaffected, just since Go's GC is concurrent, so can do work while idle.

This needs more testing, but it seems like 50 is probably a good default.

Copilot AI review requested due to automatic review settings June 22, 2026 22:18
@jakebailey

Copy link
Copy Markdown
Member Author

@typescript-bot perf test this

@typescript-automation

typescript-automation Bot commented Jun 22, 2026

Copy link
Copy Markdown

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

Command Status Results
perf test this ✅ Started 👀 Results

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR sets a lower default Go GC target for the tsgo executable to reduce peak memory usage by default, while still allowing users to override GC behavior via the existing GOGC environment variable.

Changes:

  • Add core.ApplyDefaultGOGC() to set runtime/debug.SetGCPercent(50) when GOGC is not set.
  • Invoke core.ApplyDefaultGOGC() early in cmd/tsgo startup so it applies to all tsgo modes (tsc, --lsp, --api).

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
internal/core/core.go Adds helper to apply a default GOGC value when not configured by the environment.
cmd/tsgo/main.go Calls the new helper during tsgo startup to apply the default GC percent.

Comment thread internal/core/core.go
@typescript-automation

Copy link
Copy Markdown

@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 4 4 ~ ~ ~ p=1.000 n=6
Symbols 81,764 (± 0.02%) 81,789 (± 0.01%) +25 (+ 0.03%) 81,777 81,806 p=0.045 n=6
Types 98,821 98,821 ~ ~ ~ p=1.000 n=6
Memory Used 180,334k (± 0.34%) 180,820k (± 0.49%) ~ 180,055k 182,474k p=0.810 n=6
Memory Allocs 2,546,337 (± 0.01%) 2,547,347 (± 0.01%) +1,010 (+ 0.04%) 2,546,856 2,547,835 p=0.005 n=6
Config Time 0.001s (±109.43%) 0.001s (±109.43%) ~ 0.000s 0.001s p=1.000 n=6
Parse Time 0.059s (± 4.84%) 0.068s (± 1.71%) 🔻+0.009s (+14.57%) 0.067s 0.070s p=0.005 n=6
Bind Time 0.020s (±17.56%) 0.020s (±10.49%) ~ 0.018s 0.023s p=0.808 n=6
Check Time 0s 0s ~ ~ ~ p=1.000 n=6
Emit Time 1.023s (± 1.26%) 1.075s (± 1.44%) 🔻+0.052s (+ 5.08%) 1.046s 1.086s p=0.005 n=6
Total Time 1.104s (± 1.25%) 1.165s (± 1.33%) 🔻+0.061s (+ 5.54%) 1.136s 1.177s p=0.005 n=6
angular-1 - native
Errors 3 3 ~ ~ ~ p=1.000 n=6
Symbols 876,981 (± 0.03%) 876,357 (± 0.10%) ~ 874,742 877,207 p=0.173 n=6
Types 263,749 (± 0.00%) 263,750 (± 0.00%) ~ 263,748 263,753 p=0.662 n=6
Memory Used 830,795k (± 0.06%) 830,945k (± 0.09%) ~ 830,038k 832,188k p=0.936 n=6
Memory Allocs 12,596,265 (± 0.06%) 12,606,030 (± 0.13%) ~ 12,589,804 12,631,856 p=0.378 n=6
Config Time 0.025s (±13.62%) 0.030s (±12.81%) 🔻+0.005s (+19.87%) 0.024s 0.036s p=0.044 n=6
Parse Time 0.265s (± 4.79%) 0.316s (± 4.01%) 🔻+0.051s (+19.27%) 0.298s 0.335s p=0.005 n=6
Bind Time 0.042s (±12.90%) 0.062s (±21.97%) 🔻+0.020s (+46.85%) 0.047s 0.078s p=0.013 n=6
Check Time 0s 0s ~ ~ ~ p=1.000 n=6
Emit Time 2.103s (± 0.47%) 2.227s (± 1.59%) 🔻+0.125s (+ 5.92%) 2.181s 2.286s p=0.005 n=6
Total Time 2.450s (± 0.79%) 2.656s (± 1.53%) 🔻+0.206s (+ 8.39%) 2.602s 2.711s p=0.005 n=6
mui-docs - native
Errors 11,279 (± 0.07%) 11,277 (± 0.07%) ~ 11,265 11,283 p=0.864 n=6
Symbols 4,214,838 4,214,838 ~ ~ ~ p=1.000 n=6
Types 1,534,279 1,534,279 ~ ~ ~ p=1.000 n=6
Memory Used 4,963,494k (± 0.02%) 4,964,916k (± 0.04%) ~ 4,963,292k 4,967,913k p=0.230 n=6
Memory Allocs 87,688,341 (±23.24%) 97,999,248 (±20.59%) ~ 74,854,109 124,583,865 p=0.298 n=6
Config Time 0.026s (±10.37%) 0.033s (± 5.07%) 🔻+0.007s (+25.32%) 0.031s 0.035s p=0.005 n=6
Parse Time 1.165s (±28.62%) 1.573s (±25.85%) ~ 1.158s 2.150s p=0.128 n=6
Bind Time 0.002s (±18.82%) 0.002s ~ ~ ~ p=0.405 n=6
Check Time 19.639s (± 0.78%) 20.658s (± 0.57%) 🔻+1.019s (+ 5.19%) 20.488s 20.774s p=0.005 n=6
Emit Time 0.548s (± 4.86%) 0.533s (± 4.18%) ~ 0.524s 0.579s p=0.806 n=6
Total Time 22.227s (± 1.37%) 23.698s (± 1.82%) 🔻+1.471s (+ 6.62%) 23.243s 24.343s p=0.005 n=6
self-build-src - native
Errors 0 0 ~ ~ ~ p=1.000 n=6
Symbols 1,394,138 1,394,138 ~ ~ ~ p=1.000 n=6
Types 442,153 442,153 ~ ~ ~ p=1.000 n=6
Memory Used 1,654,938k (± 0.38%) 1,653,139k (± 0.26%) ~ 1,646,445k 1,657,886k p=0.575 n=6
Memory Allocs 97,847,871 (± 0.06%) 97,911,414 (± 0.04%) ~ 97,840,865 97,958,087 p=0.093 n=6
Config Time 0.024s (±17.64%) 0.055s (±10.77%) 🔻+0.031s (+131.69%) 0.048s 0.063s p=0.005 n=6
Parse Time 0.248s (± 4.13%) 0.314s (± 4.17%) 🔻+0.066s (+26.75%) 0.302s 0.330s p=0.005 n=6
Bind Time 0.000s 0.000s (±244.70%) ~ 0.000s 0.001s p=0.405 n=6
Check Time 2.676s (± 1.04%) 2.820s (± 1.33%) 🔻+0.144s (+ 5.38%) 2.763s 2.848s p=0.005 n=6
Emit Time 0.338s (± 2.25%) 0.386s (± 8.89%) 🔻+0.048s (+14.25%) 0.339s 0.427s p=0.025 n=6
Total Time 34.313s (± 0.71%) 36.294s (± 1.49%) 🔻+1.981s (+ 5.77%) 35.686s 37.058s p=0.005 n=6
self-compiler - native
Errors 0 0 ~ ~ ~ p=1.000 n=6
Symbols 337,634 337,634 ~ ~ ~ p=1.000 n=6
Types 199,520 199,520 ~ ~ ~ p=1.000 n=6
Memory Used 332,292k (± 0.02%) 332,356k (± 0.04%) ~ 332,205k 332,545k p=0.378 n=6
Memory Allocs 4,725,443 (± 0.02%) 4,732,303 (± 0.03%) +6,860 (+ 0.15%) 4,729,895 4,734,179 p=0.005 n=6
Config Time 0.001s 0.002s (±55.72%) ~ 0.001s 0.003s p=0.176 n=6
Parse Time 0.124s (± 6.52%) 0.144s (± 4.37%) 🔻+0.021s (+16.55%) 0.135s 0.151s p=0.006 n=6
Bind Time 0.000s 0.000s ~ ~ ~ p=1.000 n=6
Check Time 1.372s (± 0.65%) 1.410s (± 1.03%) +0.039s (+ 2.82%) 1.391s 1.432s p=0.005 n=6
Emit Time 0.123s (± 4.27%) 0.140s (± 7.23%) 🔻+0.017s (+13.82%) 0.127s 0.150s p=0.030 n=6
Total Time 1.676s (± 0.41%) 1.756s (± 0.90%) 🔻+0.080s (+ 4.78%) 1.735s 1.783s p=0.005 n=6
ts-pre-modules - native
Errors 3 3 ~ ~ ~ p=1.000 n=6
Symbols 97,488 97,488 ~ ~ ~ p=1.000 n=6
Types 356 356 ~ ~ ~ p=1.000 n=6
Memory Used 133,743k (± 0.02%) 133,716k (± 0.01%) ~ 133,697k 133,734k p=0.128 n=6
Memory Allocs 183,058 (± 0.13%) 188,311 (± 1.19%) +5,253 (+ 2.87%) 183,819 189,649 p=0.005 n=6
Config Time 0.001s 0.001s (±48.94%) ~ 0.000s 0.001s p=0.405 n=6
Parse Time 0.113s (± 7.35%) 0.122s (± 3.08%) ~ 0.118s 0.128s p=0.078 n=6
Bind Time 0.041s (±13.58%) 0.045s (± 6.77%) ~ 0.039s 0.048s p=0.193 n=6
Check Time 0s 0s ~ ~ ~ p=1.000 n=6
Emit Time 0.000s 0.000s ~ ~ ~ p=1.000 n=6
Total Time 0.157s (± 3.58%) 0.172s (± 3.73%) 🔻+0.015s (+ 9.34%) 0.164s 0.180s p=0.008 n=6
vscode - native
Errors 0 0 ~ ~ ~ p=1.000 n=6
Symbols 6,691,256 6,691,256 ~ ~ ~ p=1.000 n=6
Types 2,374,896 2,374,896 ~ ~ ~ p=1.000 n=6
Memory Used 4,574,360k (± 0.02%) 4,574,709k (± 0.03%) ~ 4,572,926k 4,576,273k p=0.575 n=6
Memory Allocs 32,130,719 (± 0.05%) 32,139,386 (± 0.06%) ~ 32,116,950 32,168,121 p=0.378 n=6
Config Time 0.069s (±10.20%) 0.088s (± 6.55%) 🔻+0.019s (+27.36%) 0.082s 0.098s p=0.006 n=6
Parse Time 0.888s (± 4.18%) 1.006s (± 3.55%) 🔻+0.118s (+13.23%) 0.953s 1.049s p=0.005 n=6
Bind Time 0.137s (± 3.18%) 0.190s (±36.28%) ~ 0.131s 0.295s p=0.747 n=6
Check Time 9.088s (± 0.20%) 9.389s (± 0.57%) +0.301s (+ 3.31%) 9.310s 9.463s p=0.005 n=6
Emit Time 2.506s (± 1.62%) 2.408s (± 1.45%) 🟩-0.098s (- 3.90%) 2.347s 2.438s p=0.005 n=6
Total Time 12.704s (± 0.21%) 13.102s (± 0.44%) +0.398s (+ 3.14%) 13.010s 13.189s p=0.005 n=6
webpack - native
Errors 2 2 ~ ~ ~ p=1.000 n=6
Symbols 182,879 182,879 ~ ~ ~ p=1.000 n=6
Types 340 340 ~ ~ ~ p=1.000 n=6
Memory Used 221,792k (± 0.11%) 221,637k (± 0.11%) ~ 221,376k 221,960k p=0.173 n=6
Memory Allocs 1,066,103 (± 0.27%) 1,089,398 (± 0.70%) +23,295 (+ 2.19%) 1,078,736 1,097,641 p=0.005 n=6
Config Time 0.012s (±19.02%) 0.014s (±12.13%) ~ 0.012s 0.017s p=0.088 n=6
Parse Time 0.149s (± 5.36%) 0.200s (± 2.99%) 🔻+0.051s (+34.45%) 0.193s 0.207s p=0.005 n=6
Bind Time 0s 0s ~ ~ ~ p=1.000 n=6
Check Time 0s 0s ~ ~ ~ p=1.000 n=6
Emit Time 0.043s (±20.32%) 0.055s (±11.48%) 🔻+0.013s (+29.80%) 0.049s 0.064s p=0.031 n=6
Total Time 0.204s (± 5.53%) 0.272s (± 4.32%) 🔻+0.067s (+32.98%) 0.259s 0.288s p=0.005 n=6
xstate-main - native
Errors 0 0 ~ ~ ~ p=1.000 n=6
Symbols 1,065,023 1,065,023 ~ ~ ~ p=1.000 n=6
Types 389,185 389,185 ~ ~ ~ p=1.000 n=6
Memory Used 642,826k (± 0.01%) 642,866k (± 0.02%) ~ 642,688k 643,035k p=0.575 n=6
Memory Allocs 5,054,667 (± 0.06%) 5,084,294 (± 0.52%) +29,627 (+ 0.59%) 5,065,554 5,124,284 p=0.005 n=6
Config Time 0.002s (±18.82%) 0.003s 🔻+0.001s (+38.46%) ~ ~ p=0.007 n=6
Parse Time 0.125s (±10.39%) 0.159s (±10.98%) 🔻+0.033s (+26.76%) 0.136s 0.174s p=0.013 n=6
Bind Time 0.028s (±42.22%) 0.041s (±24.06%) 🔻+0.014s (+50.30%) 0.035s 0.061s p=0.043 n=6
Check Time 1.122s (± 0.81%) 1.161s (± 0.68%) +0.038s (+ 3.43%) 1.149s 1.170s p=0.005 n=6
Emit Time 0.001s 0.001s ~ ~ ~ p=1.000 n=6
Total Time 1.282s (± 1.40%) 1.368s (± 1.37%) 🔻+0.086s (+ 6.74%) 1.334s 1.389s p=0.005 n=6
System info unknown
Hosts
  • native
Scenarios
  • Compiler-Unions - native
  • angular-1 - native
  • mui-docs - native
  • self-build-src - native
  • self-compiler - native
  • ts-pre-modules - native
  • vscode - native
  • webpack - native
  • xstate-main - native
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

lsp

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-UnionsLSP - native
Req 1 - updateOpen 10ms (± 4.01%) 10ms (± 6.32%) ~ 9ms 11ms p=0.673 n=6
Req 2 - geterr 979ms (± 0.90%) 990ms (± 1.00%) ~ 982ms 1,009ms p=0.125 n=6
Req 3 - references 42ms (±11.65%) 40ms (± 8.53%) ~ 36ms 45ms p=0.462 n=6
Req 4 - navto 17ms (± 7.26%) 17ms (± 6.80%) ~ 16ms 19ms p=0.563 n=6
Req 5 - completionInfo count 1,357 1,357 ~ ~ ~ p=1.000 n=6
Req 5 - completionInfo 15ms (±13.32%) 18ms (±18.21%) ~ 13ms 22ms p=0.091 n=6
CompilerLSP - native
Req 1 - updateOpen 11ms (± 9.07%) 10ms (± 4.99%) ~ 10ms 11ms p=0.417 n=6
Req 2 - geterr 460ms (± 1.51%) 479ms (± 2.06%) 🔻+20ms (+ 4.24%) 469ms 496ms p=0.010 n=6
Req 3 - references 48ms (± 5.35%) 50ms (±12.29%) ~ 44ms 61ms p=0.868 n=6
Req 4 - navto 17ms 18ms (± 5.99%) ~ 16ms 19ms p=0.293 n=6
Req 5 - completionInfo count 1,519 1,519 ~ ~ ~ p=1.000 n=6
Req 5 - completionInfo 22ms (± 7.22%) 20ms (±22.39%) ~ 13ms 24ms p=0.225 n=6
System info unknown
Hosts
  • native
Scenarios
  • CompilerLSP - native
  • Compiler-UnionsLSP - native
  • xstate-main-1-LSP - native
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

startup

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
lsp-startup - native
Execution time 4.90ms (±516.54%) 4.94ms (±516.55%) ~ 0.00ms 501.25ms p=0.072 n=600
tsgo-startup - native
Execution time 6.05ms (±516.55%) 6.09ms (±516.54%) +0.04ms (+ 0.59%) 0.00ms 610.86ms p=0.000 n=600
System info unknown
Hosts
  • native
Scenarios
  • lsp-startup - native
  • tsgo-startup - native
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

Developer Information:

Download Benchmarks

@jakebailey

Copy link
Copy Markdown
Member Author

Huh... Worse?

@jakebailey

Copy link
Copy Markdown
Member Author

Well, more worse than I was expecting anyway

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants