Skip to content

Performance regression in 4.0 with semantics-only createWatchProgram? #40808

Closed
@dfreeman

Description

@dfreeman

The wiki here has a page that outlines ways to programmatically create a watched build, and suggests that createSemanticDiagnosticsBuilderProgram is likely preferable to createEmitAndSemanticDiagnosticsBuilderProgram for use cases that aren't interested in emit.

The ember-cli-typescript package uses the APIs outlined in that wiki page to integrate typechecking results into Ember CLI builds, and there've been several reports of slower re-checks after a file change from folks that have updated to typescript@4.

TypeScript Version:

  • 3.9.7 (works as expected)
  • 4.0.3 (exhibits slowdown)
  • 4.1.0-dev.20200928 (exhibits slowdown)

Search Terms:

  • createWatchProgram
  • createSemanticDiagnosticsBuilderProgram
  • 4.0 performance

Code

const ts = require('typescript');
const host = ts.createWatchCompilerHost(
  'tsconfig.json',
  { noEmit: true },
  ts.sys,
  ts.createSemanticDiagnosticsBuilderProgram
);

ts.createWatchProgram(host);

Expected behavior:
Re-checks are at least as fast with createSemanticDiagnosticsBuilderProgram as with its counterpart that tracks emit.

Actual behavior:
In a project that takes on the order of 15s to typecheck at startup, re-checking takes less than 1s with the above invocation in 3.9, as well as in 4.0 and the most recent 4.1 nightly when using createEmitAndSemanticDiagnosticsBuilderProgram.

When using createSemanticDiagnosticsBuilderProgram in 4.0 and 4.1, though, re-checking consistently takes around 5s.

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptFix AvailableA PR has been opened for this issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions