collect_fields spends extra time on selections without directives

Aberta Para iniciantes
#315 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@dexhunter já está trabalhando nisso.

Desde 8/11/2026.

  • #316 de @dexhunter — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
78/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
performance

Direção de pesquisa

Comece por visit_selection_sets() em src/graphql/execution/collect_fields.py e acompanhe a chamada a should_include_node() para seleções com e sem diretivas. Confira os testes existentes de coleta de campos e de comportamento das diretivas antes de alterar o loop. A otimização estará concluída quando preservar os resultados, os erros e as listas de diretivas proibidas, evitando verificações desnecessárias de diretivas; compare os tempos com os casos de benchmark na issue.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

visit_selection_sets() in src/graphql/execution/collect_fields.py runs for every selection set before resolvers run.
For each selection, it calls should_include_node(), even when the selection has no directives.
should_include_node() then builds two generator expressions to look for @skip and @include.

Most fields in real queries have no directives, so this work is repeated for almost every field.

Situation Now With the proposed fix Change
collect_fields on 4,000 plain fields 4458.7 µs 4113.4 µs 7.7% less time
collect_fields on 4,000 fields with @include(if: $t) 10988.9 µs 8593.5 µs 21.8% less time
collect_fields on 40 inline fragments with 100 fields each 4561.1 µs 4165.7 µs 8.7% less time
collect_fields on 400 named fragment spreads with 1 field each 960.0 µs 889.9 µs 7.3% less time

These are medians of 31 timing rounds, and the median of 3 alternating processes per version.

Proposed fix: check selection.directives once in the loop and skip the should_include_node() call when it is empty.
Find @skip and @include in one plain loop instead of two generator expressions.
Results, errors and forbidden-directive lists stay the same.

Environment: CPython 3.12.13, Linux x86-64, AMD EPYC 9R14, graphql-core main at 1d505c1.

Linguagem predominante
Python
Estrelas
534
Forks
159
Merge médio
1d 18h
PRs com merge (30d)
9

Preparar o ambiente

  • Sem Dockerfile nem arquivo Docker Compose
  • Tem um modelo de pull request
  • Sem guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de graphql-python/graphql-core

Todas as issues de graphql-python/graphql-core

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.