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 Find All References と Rename キャンセルを維持しつつ、同時にドキュメントごとに 1 つずつ起動するのではなく、同時型チェックを制限します。
外部シンボル参照検索 シンボルのバイナリ アセンブリを参照しないプロジェクトをスキップします。
FCS 増分分析 重複する要求で同じ変更に対して重複する分析チェーンが作成されないように、ビルダーの状態を同期します。

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

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

並列コンパイル では、F# 11 で既定で独立したファイルおよびコンパイラ フェーズの処理を使用します。 ソースの順序は言語の一部のままです。並列性によって前方依存が許容されるわけではありません。

ビルド タスクでは、プロセスグローバル状態を変更する代わりに、MSBuild のタスクごとの環境とパス機能も使用されます。 オーバーロード キャッシュを使用すると、繰り返しの解決が低下し、保護されたパターン のコンパイルにより、一部の結合/ガードの組み合わせで爆発的な重複が回避されます。

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

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

参照