F# 도구 성능

빌드 및 편집기 비용을 줄이기 위해 F# 11에서는 가져온 라이브러리를 공유하고 반복 분석을 방지합니다. 릴리스 수준 속도 또는 메모리 개선을 가정하지 않고 영향을 받는 워크로드를 측정합니다.

가져온 바이너리 라이브러리 공유

FSharp.Compiler.Service는 동일한 이진 종속성을 사용하는 프로젝트 간에 가져온 적격 라이브러리 그래프를 공유할 수 있습니다. FSharpChecker.Create는 shareImportedAssemblies를 노출하며, 기본적으로 사용하도록 설정됩니다. 이렇게 하면 각 프로젝트에 대해 완전히 독립적인 가져온 그래프가 유지되지 않습니다.

공유하려면 해결된 종속성과 가져오기 설정이 일치해야 합니다. Project 참조, 형식 공급자(type provider), 다중 모듈 어셈블리 및 모호한 종속성 클로저는 제외됩니다. 프레임워크 import 항목은 이미 공유되었습니다.

구현 PR은 모든 프로젝트를 확인하고 유지한 상태에서 유지된 메모리를 측정했습니다. 10개 프로젝트로 구성된 ReSharper.FSharp 워크로드는 이 공유 없이 1,547.2MB를 사용했고, 이 공유를 사용하면 1,002.2MB를 사용했습니다. 해당 컴파일러 솔루션의 워크로드는 0.1% 변경되었습니다. 이는 범용 업그레이드 절감이 아닌 특정 변경에 한정된 실험입니다. 큰 이진 참조의 겹침은 많은 차이점을 설명합니다.

보존된 메타데이터 및 임시 할당

F# 11은 지연 생성, 더 작은 테이블 및 재사용을 통해 보존된 메타데이터 를 줄입니다. 별도로 메타데이터 읽기 및 인라인 특수화는 더 적은 임시 데이터를 할당합니다. 보존된 힙, 할당 볼륨 및 프로세스 메모리는 서로 다른 메트릭입니다. 이러한 겹치는 실험의 결과를 추가하지 마세요.

편집기 분석 및 탐색

다음과 같은 개선 사항이 여러 계층에 적용됩니다.

Component 회피된 작업 또는 범위가 지정된 작업
Visual Studio 진단 텍스트 및 프로젝트 버전, 경로 및 옵션을 고려하여 변경되지 않은 문서 진단을 다시 사용합니다. 이는 임의의 오래된 결과 재사용이 아닌 반복적인 유휴 분석을 대상으로 합니다.
Visual Studio 모든 참조 찾기 및 이름 바꾸기 취소를 유지하면서 모든 문서에 대해 각 문서마다 동시에 하나씩 시작하는 대신 동시 형식 검사를 제한합니다.
외부 기호 참조 검색 기호의 이진 어셈블리를 참조하지 않는 프로젝트를 건너뜁니다.
FCS 증분 분석 겹치는 요청이 동일한 변경에 대해 중복 분석 체인을 생성하지 않도록 작성기 상태를 동기화합니다.

Peek 수정은 메타데이터 탐색 교착 상태를 방지합니다. 생성된 메타데이터 서명에는 정의로 이동을 사용하고, Peek은 기존 문서에서만 작동합니다. 이러한 개선 사항에는 애플리케이션의 Core 패키지만이 아니라 업데이트된 editor/FCS 구성 요소도 필요합니다.

컴파일 및 빌드 작업 동시성

병렬 컴파일은 F# 11에서 기본적으로 파일 및 컴파일러 단계 전반에 걸쳐 독립적으로 수행됩니다. 원본 순서는 언어의 일부로 유지됩니다. 병렬성은 전방 의존성을 정당화하지 않습니다.

또한 빌드 작업은 프로세스-전역 상태를 변경하는 대신 MSBuild의 작업별 환경 및 경로 기능을 사용합니다. 오버로드 캐싱은 반복 해상도를 줄이고, 보호된 패턴 컴파일은 일부 논리합/가드 조합에서 폭발적인 중복을 방지합니다.

필요한 메트릭을 비교

  • 빌드 지연 시간의 경우 동일한 최적화, 결정적 출력, 참조 및 캐시 설정을 사용하는 동등한 전체 빌드를 비교합니다. 제어된 비교에 --parallelcompilation-를 사용합니다.
  • 유지된 분석 메모리의 경우 동일한 프로젝트를 활성 상태로 유지하고 라이브 관리 메모리와 할당 볼륨 및 프로세스 메모리를 구분합니다.
  • 응답성을 확인하려면 편집기 작업 또는 유휴 워크로드를 재현합니다. 콘솔 프로그램의 출력은 편집자의 작업을 측정하지 않습니다.

또한, 다음을 참조하세요.