Wydajność narzędzi języka F#

Aby zmniejszyć koszty kompilacji i edytora, język F# 11 współdzieli zaimportowane biblioteki i unika wielokrotnej analizy. Mierzenie obciążenia, którego dotyczy problem, a nie przy założeniu szybkości całego wydania lub poprawy pamięci.

Importowane współdzielenie biblioteki binarnej

Biblioteka FSharp.Compiler.Service może udostępniać kwalifikowalne grafy zaimportowanych bibliotek między projektami korzystającymi z tych samych zależności binarnych. FSharpChecker.Create uwidacznia shareImportedAssemblies, domyślnie włączone. Pozwala to uniknąć zachowywania kompletnego, niezależnego zaimportowanego grafu dla każdego projektu.

Udostępnianie wymaga dopasowania rozwiązanych zależności i ustawień importowania. Odwołania do projektu, dostawcy typów danych, wielomodułowe zestawy i niejednoznaczne zamknięcia zależności są wykluczone. Importy frameworku zostały już udostępnione.

PR implementujący mierzył zachowaną pamięć po sprawdzeniu i przechowywaniu wszystkich projektów. Jego dziesięcioprojektowe obciążenie ReSharper.FSharp używało 1547,2 MB bez udostępniania i 1002,2 MB z tym udostępnianiem. Obciążenie rozwiązania kompilatora zmieniło się tylko o 0,1%. Są to eksperymenty dotyczące konkretnych zmian, a nie uniwersalne oszczędności związane z aktualizacją. Nakładanie się dużych odwołań binarnych wyjaśnia znaczną część różnicy.

Zachowane metadane a przydziały tymczasowe

Język F# 11 zmniejsza zachowywane metadane przez tworzenie z opóźnieniem, mniejsze tabele i ponowne użycie. Oddzielnie odczyt metadanych i specjalizacja śródliniowa przydzielają mniej danych tymczasowych. Zatrzymany rozmiar sterty, rozmiar alokacji i pamięć procesu to różne metryki; nie dodawaj wyników z tych nakładających się eksperymentów.

Analiza edytora i nawigacja

Następujące ulepszenia dotyczą różnych warstw:

Component Praca unikana lub ograniczona granicami
diagnostyka Visual Studio Ponownie używa diagnostyki niezmienionych dokumentów, uwzględniając wersje tekstu i projektu, ścieżki oraz opcje. Dotyczy to powtarzanej analizy bezczynności, a nie dowolnego ponownego użycia nieaktualnych wyników.
Visual Studio Znajdź wszystkie odwołania i Zmień nazwę Ogranicza równoczesne sprawdzanie typów zamiast uruchamiać sprawdzanie dla każdego dokumentu jednocześnie, zachowując anulowanie.
Wyszukiwanie odwołań do symboli zewnętrznych Pomija projekty, które nie odwołują się do asembacji binarnej symbolu.
Analiza przyrostowa usługi FCS Synchronizuje stan konstruktora, tak aby nakładające się żądania nie konstruowały zduplikowanych łańcuchów analizy dla tej samej zmiany.

Poprawka Peek zapobiega zakleszczeniu nawigacji po metadanych. Użyj funkcji Przejdź do definicji dla wygenerowanych sygnatur metadanych; funkcja Peek działa tylko w istniejących dokumentach. Te ulepszenia wymagają zaktualizowanych składników edytora/FCS, a nie tylko pakietu podstawowego aplikacji.

Współbieżność kompilacji i zadań budowania

Kompilacja równoległa domyślnie używa niezależnej pracy nad plikami i fazami kompilatora w języku F# 11. Uporządkowanie źródłowe pozostaje częścią języka; równoległość nie legalizuje zależności skierowanych do przodu.

Zadania builda używają również środowiska dla poszczególnych zadań programu MSBuild i mechanizmów obsługi ścieżek zamiast zmieniania globalnego stanu procesu. Buforowanie wyników rozpoznawania przeciążeń zmniejsza potrzebę ponownego rozpoznawania, a kompilacja chronionych wzorców pozwala uniknąć gwałtownego przyrostu duplikacji w niektórych kombinacjach alternatywy/strażnika.

Porównaj potrzebną metrykę

  • W przypadku opóźnienia kompilacji porównaj równoważne pełne kompilacje z identycznymi ustawieniami optymalizacji, danych wyjściowych deterministycznych, referencji i pamięci podręcznej. Służy --parallelcompilation- do kontrolowanego porównania.
  • W przypadku analizy pamięci zachowanej pozostaw te same projekty uruchomione i odróżniaj aktywną pamięć zarządzaną od woluminu alokacji i pamięci procesu.
  • Aby ocenić responsywność, odtwórz akcję edytora lub bezczynne obciążenie. Wynik programu konsolowego nie mierzy pracy edytora.

Informacje dodatkowe