F# ツールのパフォーマンス

ビルドとエディターのコストを削減するために、F# 11 はインポートされたライブラリを共有し、繰り返し分析を回避します。 リリース全体の速度やメモリの向上を想定するのではなく、影響を受けるワークロードを測定します。

インポートされたバイナリ ライブラリの共有

FSharp.Compiler.Service は、同じバイナリ依存関係を使用するプロジェクト間で、インポート対象のライブラリ グラフを共有できます。 FSharpChecker.Create は shareImportedAssemblies を公開します。デフォルトでは有効になっています。 これにより、プロジェクトごとに完全に独立したインポートされたグラフが保持されるのを回避できます。

共有するには、解決された依存関係とインポート設定の照合が必要です。 Project参照、型プロバイダー、マルチモジュール アセンブリ、あいまいな依存関係クロージャは除外されます。 フレームワークのインポートは既に共有されています。

実施の PR は、すべてのプロジェクトを確認して保持した後、保持されたメモリ量を測定します。 10 プロジェクトの ReSharper.FSharp ワークロードでは、この共有なしで 1,547.2 MB、この共有ありでは 1,002.2 MB を使用しました。 このコンパイラ ソリューションのワークロードは、わずか 0.1% しか変化しません。 これらは特定の変更を対象とした実験であり、アップグレード全般に適用されるコスト削減効果ではありません。 大きな バイナリ 参照での重複は、その違いの多くを説明します。

保持されたメタデータと一時的な割り当て

F# 11 では、遅延生成、テーブルの小型化、再利用によって、保持されるメタデータの量を削減しています。 また、メタデータの読み取りやインライン特化では、一時データの割り当て量が少なくなります。 保持されるヒープ、割り当てボリューム、およびプロセス メモリは異なるメトリックです。これらの重複する実験の結果を追加しないでください。

エディターの分析とナビゲーション

次の機能強化は、さまざまなレイヤーに適用されます。

コンポーネント 回避または制限された作業
Visual Studio診断 テキストとプロジェクトのバージョン、パス、およびオプションを考慮して、変更されていないドキュメント診断を再利用します。 これは、任意の古い結果の再利用ではなく、アイドル状態で繰り返し実行される解析を対象としています。
Visual Studio の「すべての参照を検索」と「名前の変更」 キャンセルを維持しつつ、ドキュメントごとに個別に型チェックを実行するのではなく、同時実行される型チェックの数を制限します。
外部シンボル参照検索 シンボルのバイナリ アセンブリを参照しないプロジェクトをスキップします。
FCS 増分分析 重複する要求で同じ変更に対して重複する分析チェーンが作成されないように、ビルダーの状態を同期します。

Peek の修正により、メタデータ ナビゲーションのデッドロックが回避されます。 生成されたメタデータ署名に対して [定義に移動] を使用します。Peek は既存のドキュメントのみが対象です。 これらの機能強化には、アプリケーションの Core パッケージだけでなく、エディター/FCS コンポーネントを更新する必要があります。

コンパイルとビルドタスクの並行性

F# 11 では、並列コンパイルにおいて、デフォルトでファイル単位とコンパイラ フェーズごとの独立した処理が行われます。 ソースの順序は言語の一部のままです。並列性によって前方依存が許容されるわけではありません。

ビルド タスクでは、プロセスグローバル状態を変更する代わりに、MSBuild のタスクごとの環境とパス機能も使用されます。 オーバーロードのキャッシュによって、繰り返し発生する名前解決処理が削減されます。また、ガード付きパターンのコンパイルによって、一部の選言とガード条件の組み合わせで発生する、爆発的なコードの重複を回避できます。

必要なメトリックを比較する

  • ビルド遅延については、同じ最適化、決定論的出力、参照、キャッシュ設定の同等な完全ビルドを比較します。 厳密な比較を行うには、--parallelcompilation- を使用します。
  • 分析用メモリを保持する場合は、同じプロジェクトをアクティブな状態に保ち、ライブ管理メモリと割り当て容量とプロセス メモリを区別します。
  • 応答性を確認するには、エディタの操作またはアイドル時のワークロードを再現します。 コンソール プログラムの出力では、エディターの作業は分かりません。

参照