Desempenho de ferramentas do F#

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

Compartilhamento de biblioteca binária importada

FSharp.Compiler.Service pode compartilhar grafos de biblioteca importados qualificados entre projetos que usam as mesmas dependências binárias. FSharpChecker.Create exibe shareImportedAssemblies, habilitado por padrão. Isso evita manter um grafo importado independente completo para cada projeto.

O compartilhamento requer a correspondência de dependências resolvidas e configurações de importação. Referências de projeto, provedores de tipos, assemblies de vários módulos e fechamentos de dependência ambíguos são excluídos. As importações de framework já foram compartilhadas.

A PR de implementação mediu a memória retida depois de verificar e manter todos os projetos. Sua carga de trabalho ReSharper.FSharp de dez projetos usou 1.547,2 MB sem esse compartilhamento e 1.002,2 MB com ele. Sua carga de trabalho do compiler-solution foi alterada em apenas 0,1%. Estes são experimentos específicos de alteração, não economias universais de atualização. A sobreposição em grandes referências binárias explica grande parte da diferença.

Metadados retidos versus alocações temporárias

O F# 11 reduz os metadados retidos por meio da criação sob demanda, tabelas menores e reutilização. Separadamente, a leitura de metadados e a especialização embutida 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 desses experimentos sobrepostos.

Análise e navegação do editor

As melhorias a seguir se aplicam a diferentes camadas:

Componente Trabalho evitado ou delimitado
diagnósticos do Visual Studio Reutiliza os diagnósticos de documento inalterado considerando versões de texto e projeto, caminhos e opções. Isso visa a análise ociosa repetida, não a reutilização arbitrária de resultados obsoletos.
Visual Studio localizar todas as referências e renomear Limita as verificações de tipo simultâneas em vez de iniciar uma para cada documento ao mesmo tempo, mantendo o cancelamento.
Pesquisa de referência de símbolo externo Ignora projetos que não fazem referência ao assembly binário do símbolo.
Análise incremental do FCS Sincroniza o estado do construtor para que as solicitações sobrepostas não construam cadeias de análise duplicadas para a mesma alteração.

A correção peek evita um deadlock de navegação de metadados. Use Go To Definition para assinaturas de metadados geradas; Peek funciona apenas com documentos existentes. Essas melhorias exigem componentes do editor/FCS atualizados, não apenas o pacote Core de um aplicativo.

Compilação e concorrência de tarefa de build

A compilação paralela usa trabalho independente por arquivo e por fase do compilador por padrão no F# 11. A ordenação da origem permanece parte do idioma; o paralelismo não legaliza as dependências futuras.

As tarefas de build também usam o ambiente por tarefa do MSBuild e os recursos de caminho em vez de alterar o estado global do processo. O cache de sobrecargas reduz a resolução repetida e a compilação de padrão protegido evita a duplicação explosiva em algumas combinações de disjunção/proteção.

Comparar a métrica necessária

  • Para latência de build, compare builds completos equivalentes com otimização idêntica, saída determinística, referência e configurações de cache. Use --parallelcompilation- para uma comparação controlada.
  • Para memória de análise retida, mantenha os mesmos projetos ativos e distinga a memória gerenciada ao vivo do volume de alocação e da memória do processo.
  • Para verificar a capacidade de resposta, reproduza a ação do editor ou a carga de trabalho ociosa. A saída de um programa de console não mede o trabalho de um editor.

Consulte também