為了降低建置與編輯階段成本,F# 11 共享匯入的函式庫並避免重複分析。 衡量受影響的工作負載,而非假設整個版本的速度或記憶體提升。
匯入的二進位程式庫共享
FSharp.Compiler.Service 可以在使用相同二進位相依關係的專案間分享合格的匯入程式庫圖。
FSharpChecker.Create 會公開 shareImportedAssemblies,且預設為啟用。 這樣可以避免為每個專案保留完整獨立的匯入圖。
分享需要相符的已解析相依性與匯入設定。 Project 參考、型別提供者、多模組組件及模糊的相依性閉包皆被排除。 框架匯入已經是共用的。
實作 PR 在檢查並保留所有專案後,測量了保留的記憶體。 其十個專案的 ReSharper.FSharp 工作負載在未共用時佔用 1,547.2 MB,使用此共用時則佔用 1,002.2 MB。 其編譯器解決方案工作負載僅改變了 0.1%。 這些是針對變更的實驗,並非普遍的升級節省。 大型 二進位 參照的重疊解釋了許多差異。
保留的中繼資料與暫時分配
F# 11 透過懶散建立、縮小資料表及重複使用,減少 保留的元資料 。 另外,元資料讀取與內嵌特化會配置較少的暫時資料。 保留堆積、配置容量與程序記憶體是不同的指標;不要將這些重疊實驗的結果相加。
編輯分析與導覽
以下改進適用於不同層級:
| Component | 已避免或已界定的工作 |
|---|---|
| Visual Studio 診斷 | 重用未變更文件的診斷結果,並考慮了文字與專案版本、路徑與選項。 這是針對重複的閒置時分析,而非任意重複使用陳舊結果。 |
| Visual Studio 尋找所有參考資料並重新命名 | 限制同時進行型別檢查,而非同時為每份文件各自啟動型別檢查,同時保留取消功能。 |
| 外部符號參考搜尋 | 跳過不參考符號二進位組件的專案。 |
| FCS 增量分析 | 同步建構器狀態,避免重疊請求為相同變更建立重複分析鏈。 |
Peek fix避免了元資料導覽的死結。 使用「前往定義」來查看產生的中繼資料簽章;Peek 會停留在現有文件上。 這些改進需要已更新的編輯器/FCS 元件,而不僅僅是應用程式的核心套件。
編譯與建置任務並行
平行編譯 在 F# 11 中預設使用獨立的檔案與編譯器階段工作。 來源排序仍是語言的一部分;平行性並不合法化前向依賴。
建置任務也使用 MSBuild 的每個任務環境與路徑功能,而非更改處理程序的全域狀態。 過載快取會減少重複解析,而守護模式編譯則避免某些析取/守衛組合中的爆炸性重複。
比較你需要的指標
- 關於建置延遲,請比較同等的完整建置,且在相同優化、確定性輸出、參考和快取設定下。 使用
--parallelcompilation-進行受控比較。 - 對於保留的分析記憶體,保持相同專案存活,並區分存活的受控記憶體與配置量及程序記憶體。
- 為了回應速度,請重現編輯器動作或閒置工作負載。 主控台程式的輸出並不衡量編者的作品。