Desempenho das ferramentas de F#

Para reduzir custos de compilação e editor, o F#11 partilha bibliotecas importadas e evita análises repetidas. Meça a carga de trabalho afetada em vez de assumir uma melhoria de velocidade ou de memória ao nível de toda a versão.

Partilha de biblioteca binária importada

O FSharp.Compiler.Service pode partilhar grafos de biblioteca importados elegíveis entre projetos que utilizam as mesmas dependências binárias. FSharpChecker.Create expõe shareImportedAssemblies, ativado por defeito. Isto evita manter um grafo importado independente completo para cada projeto.

Partilhar requer dependências resolvidas correspondentes e definições de importação. Referências de projeto, fornecedores de tipos, assemblies multi-módulo e encerramentos ambíguos de dependências são excluídos. As importações de frameworks já tinham sido disponibilizadas.

A PR de implementação mediu a memória retida após verificar e manter todos os projetos. A sua carga de trabalho ReSharper.FSharp de dez projetos usava 1.547,2 MB sem esta partilha e 1.002,2 MB com ela. A carga de trabalho da solução do compilador mudou apenas em 0,1%. Estes são testes específicos da alteração, não economias universais de atualização. A sobreposição em grandes referências ao binário explica grande parte da diferença.

Metadados retidos versus alocações temporárias

F#11 reduz metadados retidos através de criação preguiçosa, tabelas mais pequenas e reutilização. Separadamente, a leitura de metadados e a especialização inline alocam menos dados temporários. Heap retido, volume de alocação e memória de processo são métricas diferentes; não adicione resultados destes ensaios sobrepostos.

Análise e navegação do editor

As seguintes melhorias aplicam-se a diferentes camadas:

Component Trabalho evitado ou delimitado
Diagnóstico do Visual Studio Reutiliza diagnósticos para documentos inalterados, considerando versões de texto e projetos, caminhos e opções. Isto visa a análise repetida em inatividade, não a reutilização arbitrária de resultados obsoletos.
Visual Studio Encontrar Todas as Referências e Renomear Limita verificações de tipos concorrentes em vez de lançar uma para cada documento de uma só vez, mantendo o cancelamento.
Pesquisa de referências a símbolos externos Salta projetos que não referenciam o assembly binário do símbolo.
Análise incremental FCS Sincroniza o estado do construtor para que pedidos sobrepostos não construam cadeias de análise duplicadas para a mesma alteração.

A correção do Peek evita um interbloqueio de metadados e navegação. Utilize Ir Para a Definição para assinaturas de metadados geradas; Peek mostra apenas documentos existentes. Estas melhorias requerem componentes do editor/FCS atualizados, não apenas o pacote Core da aplicação.

Compilação e concorrência entre compilação e tarefas de compilação

A compilação paralela utiliza, por predefinição, trabalho independente ao nível dos ficheiros e das fases do compilador no F# 11. A ordenação de fontes mantém-se parte da linguagem; o paralelismo não legaliza dependências antecipadas.

As tarefas de build também utilizam o ambiente por tarefa e as funcionalidades de caminho do MSBuild em vez de alterar o estado global do processo. O armazenamento em cache de sobrecargas reduz a resolução repetida, e a compilação de padrões guardados evita duplicação explosiva em algumas combinações de disjunção/guarda.

Compare a métrica de que precisa

  • Para a latência da compilação, compare compilações completas equivalentes com otimização, saída determinística, referência e definições de cache idênticas. Utilize --parallelcompilation- para uma comparação controlada.
  • Para memória de análise retida, mantenha os mesmos projetos ativos e distinga a memória gerida ativa do volume de alocação e da memória do processo.
  • Para avaliar a capacidade de resposta, reproduza a ação do editor ou a carga de trabalho inativa. A saída de um programa de consola não mede o trabalho de um editor.

Ver também