Leistung der F#-Tools

Um die Build- und Editorkosten zu reduzieren, nutzt F# 11 importierte Bibliotheken gemeinsam und vermeidet wiederholte Analysen. Messen Sie die betroffene Workload, anstatt eine releaseweite Geschwindigkeits- oder Arbeitsspeicherverbesserung anzunehmen.

Importierte gemeinsame Nutzung von Binärbibliotheken

FSharp.Compiler.Service kann geeignete importierte Bibliotheksgraphen projektübergreifend für Projekte freigeben, die dieselben binären Abhängigkeiten verwenden. FSharpChecker.Create stellt shareImportedAssemblies bereit und ist standardmäßig aktiviert. Dadurch wird verhindert, dass für jedes Projekt ein vollständiges unabhängiges, importiertes Diagramm beibehalten wird.

Die Freigabe erfordert übereinstimmende aufgelöste Abhängigkeiten und Importeinstellungen. Projektverweise, Typanbieter, Multi-Modul-Assemblys und mehrdeutige Abhängigkeitsabschlüsse werden ausgeschlossen. Framework-Importe wurden bereits geteilt.

Die implementierende PR ermittelte den belegten Speicher nach der Überprüfung und dem Halten aller Projekte im Speicher. Der zehn-Projekt-Workload ReSharper.FSharp verwendete 1.547,2 MB ohne diese Freigabe und 1.002,2 MB damit. Seine Compiler-Solution-Workload änderte sich nur um 0,1 %. Dies sind änderungsspezifische Experimente, keine universellen Upgradeeinsparungen. Die Überlappung in großen binären Referenzen erklärt einen Großteil des Unterschieds.

Beibehaltene Metadaten im Vergleich zu temporären Zuweisungen

F# 11 reduziert die beibehaltenen Metadaten durch verzögerte Erstellung, kleinere Tabellen und Wiederverwendung. Separat weisen Metadatenlesen und Inline-Spezialisierung weniger temporäre Daten zu. Beibehaltener Heap, Allokationsvolumen und Prozessspeicher sind unterschiedliche Metriken; fügen Sie keine Ergebnisse aus diesen überlappenden Experimenten hinzu.

Editoranalyse und -navigation

Die folgenden Verbesserungen gelten für verschiedene Ebenen:

Component Arbeit vermieden oder begrenzt
Visual Studio-Diagnose Verwendet erneut Diagnosen für unveränderte Dokumente unter Berücksichtigung von Text- und Projektversionen, Pfaden und Optionen. Dies zielt auf wiederholte Leerlaufanalyse ab, nicht auf eine willkürliche Wiederverwendung von veralteten Ergebnissen.
Visual Studio Alle Verweise suchen und Umbenennen Beschränkt gleichzeitige Typüberprüfungen, anstatt eins für jedes Dokument gleichzeitig zu starten, wobei die Möglichkeit zum Abbrechen erhalten bleibt.
Referenzsuche für externe Symbole Überspringt Projekte, die nicht auf die binäre Assembly des Symbols verweisen.
FCS-inkrementelle Analyse Synchronisiert den Builder-Status, sodass überlappende Anfragen keine doppelten Analyseketten für dieselbe Änderung erstellen.

Die Peek fix vermeidet einen Deadlock bei der Metadatennavigation. Verwenden Sie Go To Definition für generierte Metadatensignaturen; Peek funktioniert nur bei vorhandenen Dokumenten. Diese Verbesserungen erfordern aktualisierte Editor-/FCS-Komponenten, nicht nur das Core-Paket einer Anwendung.

Kompilierung und Parallelität von Buildaufgaben

Die parallele Kompilierung verwendet in F# 11 standardmäßig unabhängige Arbeitsschritte für Dateien und Compilerphasen. Die Quellreihenfolge bleibt Teil der Sprache; Parallelität legalisiert Vorwärtsabhängigkeiten nicht.

Buildtasks verwenden auch die Umgebungs- und Pfadfunktionen von MSBuild, anstatt den prozessglobalen Zustand zu ändern. Overload-Caching reduziert wiederholte Auflösung, und die Kompilierung von Guarded Patterns vermeidet explosive Duplizierungen in einigen Kombinationen aus Disjunktionen und Guards.

Benötigte Metrik vergleichen

  • Vergleichen Sie bei der Buildlatenz gleichwertige vollständige Builds mit identischer Optimierung, deterministischer Ausgabe, Referenzeinstellungen und Cacheeinstellungen. Verwenden Sie --parallelcompilation- für einen kontrollierten Vergleich.
  • Halten Sie für die beibehaltene Analyse dieselben Projekte aktiv und unterscheiden Sie aktiven verwalteten Speicher von Zuweisungsvolumen und Prozessspeicher.
  • Zur Messung der Reaktionsfähigkeit reproduzieren Sie die Editoraktion oder die Arbeitsauslastung im Leerlauf. Die Ausgabe eines Konsolenprogramms misst nicht die Arbeit eines Editor-Programms.

Siehe auch