2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

tsgo での交差型とインターフェース継承のコンパイル速度比較

Posted at

きっかけ

Microsoft の公式ブログで TypeScript 7 の進捗状況を読んでいたところ、気になる記載がありました。

TypeScript 6.0 is the Last JavaScript-Based Release

TypeScript 6.0 will be our last release based on the existing TypeScript/JavaScript codebase.

TypeScript 6.0 が既存のコンパイラ実装に基づく最後のリリースになり、それ以降は Go 言語で書き直された新しい実装(TypeScript 7.0 / tsgo)へ完全に移行するとのことです。

従来の tsc は TypeScript で書かれており、JavaScript にトランスパイルされて JavaScript ランタイム(Node.js、Deno、Bun など)上で実行されますが、新しい tsgo は Go で書かれており、機械語にコンパイルされたネイティブバイナリとして直接実行されます公式ブログでは、このネイティブ実装のパフォーマンス改善について以下のように述べています。

The native implementation will drastically improve editor startup, reduce most build times by 10x, and substantially reduce memory usage.

また、VS Code のコードベースを例に挙げて、エディタでのプロジェクト読み込み時間についても次のように報告しています。

the current time to load the entire project in the editor on a fast computer is about 9.6 seconds. This drops down to about 1.2 seconds with the native language service, an 8x improvement

まとめると、tsgo(ネイティブ実装)は、従来の tsc と比較して以下のようなパフォーマンス改善が実現されると言及しています。

  • ビルド時間が約 10 倍高速化
  • エディタでのプロジェクト読み込みが約 8 倍高速化 - VS Code でプロジェクトを開いたときの言語サービス起動時間が 9.6 秒から 1.2 秒に短縮
  • メモリ使用量の削減

tsgo は現時点では開発中であり、日々更新が行われています(本記事の測定時点(2025 年 12 月 4 日)のバージョンは 7.0.0-dev.20251204.1 です)。型チェック機能はほぼ完成していますが、JavaScript コード生成については es2021 以降のターゲットのみ対応、デコレーター変換は未対応など、一部機能に制限があります。ただし、型チェックのパフォーマンスについては十分に評価できる状態とのことです。

この大幅なパフォーマンス改善を実際に体感してみたいと思い、tsgo での型チェック速度を測定することにしました。ちょうど以前、TypeScript における交差型とインターフェース継承のコンパイルパフォーマンスを測定したことがあったので、同じ条件で tsgo を測定し、以前の tsc の結果と比較すれば、どの程度高速化されているのかが分かりやすいと考えました。

検証方法

測定対象

今回は 型チェックのパフォーマンス に焦点を当て、--noEmit オプションを使用して JavaScript コードを生成せずに測定しました。これにより、純粋に型システムの処理速度を比較できます。

今回新たに測定したのは tsgo(新しいネイティブコンパイラ) での交差型 vs インターフェース継承です。以前の tsc の測定と同じ条件で測定し、両者の性能を比較しました。

テストケース

以前の tsc 測定と同様に、以下の 3 つの観点×キャッシュのありなしでコンパイル時間を測定しました。

  1. 型の数を増やした場合 (1, 10, 100, 1000, 10000)
  2. 各型のプロパティ数を増やした場合 (1, 10, 100, 1000, 10000)
  3. アクセスするプロパティ数を増やした場合 (1, 10, 100, 1000, 10000)

サンプルコード

交差型のテストコード例

// 型の数: 3個
type Type1 = { prop1_1: string }; // プロパティ数: 1個
type Type2 = { prop2_1: string }; // プロパティ数: 1個
type Type3 = { prop3_1: string }; // プロパティ数: 1個

type CombinedType = Type1 & Type2 & Type3;

function testFunction(obj: CombinedType) {
  // アクセスするプロパティ数: 3個
  const access1 = obj.prop1_1;
  const access2 = obj.prop2_1;
  const access3 = obj.prop3_1;
  return obj;
}

インターフェース継承のテストコード例

// 型の数: 3個
interface Type1 {
  prop1_1: string; // プロパティ数: 1個
}
interface Type2 {
  prop2_1: string; // プロパティ数: 1個
}
interface Type3 {
  prop3_1: string; // プロパティ数: 1個
}

interface CombinedType extends Type1, Type2, Type3 {}

function testFunction(obj: CombinedType) {
  // アクセスするプロパティ数: 3個
  const access1 = obj.prop1_1;
  const access2 = obj.prop2_1;
  const access3 = obj.prop3_1;
  return obj;
}

環境

  • TypeScript: 5.6.0
  • tsgo: @typescript/native-preview 7.0.0-dev.20251204.1
  • Node.js: 24.11.0
  • 各測定は 5 回実行して平均値を算出
  • コンパイルオプション: --noEmit

キャッシュの設定

キャッシュなし

  • 各測定ごとに一時ディレクトリを完全に削除・再作成
  • コンパイルオプション: キャッシュ関連の設定なし
  • 毎回フルコンパイルを実行

キャッシュあり

  • 同じディレクトリで繰り返しコンパイルを実行

  • コンパイルオプション:

    {
      "incremental": true,
      "tsBuildInfoFile": ".tsbuildinfo"
    }
    
  • 2 回目以降のコンパイルで .tsbuildinfo ファイルのキャッシュが利用される

  • 測定は 2 回目以降の実行時間を記録(初回のキャッシュ生成は除外)

測定結果

1. 型の数による比較

キャッシュなし

image.png

キャッシュあり

image.png

主な発見

  • tsgo では交差型とインターフェース継承の差がほぼない

    • キャッシュの有無に関わらず、10000 型でもほぼ同等の速度
    • 統計的な有意差なし(p > 0.05)
    • 比較:tsc ではキャッシュなしの場合、10000 型でインターフェース継承が約 1.9 倍遅い(交差型の方が高速)。キャッシュありではこの差はほぼ解消される
  • tsgo は常に高速

    • キャッシュなし: 交差型 6.2 倍、インターフェース継承 12.1 倍高速
    • キャッシュあり: 両方とも約 1.5 倍高速
    • キャッシュによる高速化: tsgo は約 14 倍、tsc は約 60〜110 倍

2. 各型のプロパティ数による比較

キャッシュなし

image.png

キャッシュあり

image.png

主な発見

  • tsgo では微小な差のみ

    • プロパティ数 10000 で初めて有意差が検出(p < 0.05)
    • ただし実際の差は実用上無視できるレベル
    • 比較:tsc でもプロパティ数による有意差は見られない
  • tsgo の速度優位性

    • キャッシュなし: 平均 3〜4 倍高速
    • キャッシュあり: 平均 1.5〜1.6 倍高速

3. アクセスするプロパティ数による比較

キャッシュなし

image.png

キャッシュあり

image.png

主な発見

  • アクセスするプロパティ数はコンパイル時間にほとんど影響しない

    • キャッシュの有無に関わらず、tsc・tsgo ともに有意差がほとんどない
    • TypeScript の型チェックは、実際に使用するプロパティ数に依存しない
  • tsgo は一貫して高速

    • キャッシュなし: 3 倍前後高速
    • キャッシュあり: 1.2〜1.3 倍高速

統計的分析

対応のある t 検定による有意差検定を実施しました(各測定 5 回の繰り返し)。

tsgo における交差型 vs インターフェース継承(キャッシュなし)

テストケース 有意差あり 該当データ数
型の数 0/5 ケース (0%) なし
プロパティ数 1/5 ケース (20%) 10000 (p<0.05, 交差型が 166ms 速い)
アクセス数 1/5 ケース (20%) 1000 (p<0.05, 交差型が 26ms 遅い)

結論: tsgo では交差型とインターフェース継承の間にほとんど差がない(有意差は 15 ケース中 2 ケースのみ、かつ実用上無視できる差)。どちらが速いかは一定でない。

tsgo における交差型 vs インターフェース継承(キャッシュあり)

テストケース 有意差あり 該当データ数
型の数 2/5 ケース (40%) 100 (p<0.01, 交差型が 30ms 遅い), 10000 (p<0.05, 交差型が 22ms 速い)
プロパティ数 0/5 ケース (0%) なし
アクセス数 2/5 ケース (40%) 10 (p<0.01, 交差型が 48ms 遅い), 1000 (p<0.05, 交差型が 28ms 遅い)

結論: キャッシュありでも一部で有意差が検出されるが、差は実用上無視できるレベル(15 ケース中 4 ケース有意差、最大差 48ms)。どちらが速いかは一定でない。

tsc vs tsgo の速度比較(キャッシュなし)

比較対象 有意差あり 速度向上(倍率)
交差型 15/15 ケース (100%) 2.5 倍〜6.2 倍高速
インターフェース継承 15/15 ケース (100%) 2.5 倍〜12.1 倍高速

すべてのケースで p < 0.001 の非常に有意な差。tsgo は tsc より一貫して高速。

tsc vs tsgo の速度比較(キャッシュあり)

比較対象 有意差あり 速度向上(倍率)
交差型 15/15 ケース (100%) 1.2 倍〜1.6 倍高速
インターフェース継承 15/15 ケース (100%) 1.3 倍〜1.6 倍高速

キャッシュありでもすべてのケースで p < 0.001 の非常に有意な差。tsgo の優位性はキャッシュの有無に関わらず確認された。

前回調査(tsc のみ)からの変化

前回の調査では tsc のキャッシュなしのみを測定しましたが、今回キャッシュありの測定を追加したところ、以下の変化が確認されました。

  • キャッシュあり・型の数・10000データ: 交差型とインターフェース継承の有意差が消失

まとめ

わかったこと

  1. tsgo では交差型とインターフェース継承のパフォーマンス差の問題が解決されている

    • 交差型とインターフェース継承の差がほぼゼロ
    • 統計的有意差もほとんどなし
  2. tsgo は全体的に tsc より 3〜12 倍高速

    • 交差型: 2.5〜6.2 倍
    • インターフェース継承: 2.5〜12.1 倍
    • 型が多いほど高速化の恩恵が大きい

感想

tsgo を実際に使ってみて、コンパイル速度の改善に驚きました。特に興味深かったのは、tsc では型の数が多い場合(10000 型)にキャッシュなしで交差型とインターフェース継承の間に大きなパフォーマンス差が見られましたが、tsgo ではキャッシュの有無に関わらず両者のパフォーマンスがほぼ同等になっている点です。

ただし、今回の測定は実験的な手法で行われたものであり、実際のアプリケーション開発においても同様の結果が得られるかは保証できません。プロジェクトの規模、コードの複雑さ、使用する TypeScript の機能など、さまざまな要因によってパフォーマンスは変動する可能性があります。

これからも正式リリースまでの開発状況を注視していきたいと思います。


参考資料

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?