microsoft / microsoft/TypeScript

tsc -b: builders idle on upstream projects because projects are scheduled in depth-first reference order

Abierto
#64,222 0 comentarios 0 reacciones 1 asignado Ver en GitHub

@johnfav03 ya está trabajando en esto.

Desde el 14/9/2026.

Needs Investigation
Lenguaje dominante
Go
Estrellas
111k
Forks
14.3k
Merge medio
2 d 4 h
PR fusionados (30 d)
132

Descripción

🔎 Search Terms

tsc -b, build mode, --builders, project references, parallel build, idle builders, build order, depth-first, tsgo

🕗 Version & Regression Information
  • TypeScript 7.0.2 (@typescript/native-preview) and main (7.1.0-dev). Not a regression: the scheduling has always worked this way in the Go build orchestrator.
⏯ Playground Link

Not applicable (build-mode scheduling).

💻 Code

Any wide project-reference graph with tsc -b <root> --builders N. The root's references are handed to builders in the depth-first (topological) order, e.g. for

root -> A -> B -> C -> D      (a chain)
root -> E, F, G, H, ...       (many independent leaves)

the order is D, C, B, A, E, F, G, H, …. Builder 1 takes D, builder 2 takes C and blocks on D, builder 3 takes B and blocks on C, builder 4 takes A and blocks on B. Only after the chain is done do the leaves get built, even though they were buildable from the start.

🙁 Actual behavior

Builders spend most of their time blocked in waitOnUpstream. On a monorepo of 19,430 composite projects (dependency graph 124 levels deep) a cold tsc -b on a 64-core machine kept ~13 of 32 builders busy on average. Sorting the root references by dependency depth by hand cut the cold build from 5.4 to 4.1 min, and the reference order of a config file should not have that effect.

🙂 Expected behavior

The builders should be kept busy regardless of how references are ordered: schedule projects so that every project at a lower dependency depth has been picked up before a builder takes a deeper one (a stable sort of the topological order by depth), while keeping the reported output order unchanged.

Additional information about the issue

Measured with a patched build of main (--builders 8, cold, 4 runs each): alphabetical root 530 s → 262 s median (2.0× faster), depth-sorted root 442 s → 261 s. CPU time unchanged (~3,150 s user), so the gain is idle time removed; peak RSS +15% because more builders actually compile at once. I have a PR for this.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.