collect_fields spends extra time on selections without directives
Mantenedores costumam responder em até 1 dia
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
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de graphql-python/graphql-core
-
is_printable_as_block_string checks each character in a Python loopTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
graphql-python/graphql-core#312 ·
Mantenedores costumam responder em até 1 dia
-
natural_comparison_key: faster sort keys for names without digitsTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
graphql-python/graphql-core#310 ·
Mantenedores costumam responder em até 1 dia
-
Make is_awaitable faster for values that are not awaitableTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
graphql-python/graphql-core#308 ·
Mantenedores costumam responder em até 1 dia
-
assert_name checks each character in a Python generatorTalvez já em andamento @swayamdudhela assumiu há 2 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
graphql-python/graphql-core#304 · 4 comentários ·
Mantenedores costumam responder em até 1 dia
-
coerce_input_literal spends extra time on type checks and non-null recursionTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
graphql-python/graphql-core#302 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de graphql-python/graphql-core
Issues semelhantes
-
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 76/100
Mantenedores costumam responder em até 1 dia
-
bug documentation good first issue help wanted testing
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
-
Show evidence time and supersede warnings in the memory inspectorTalvez já em andamento @Sinchanak-212 assumiu hoje. Abertaarea: ux good first issue priority: medium
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 86/100
daniel-ospina/tortoise#11649 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 86/100
ComposioHQ/awesome-claude-skills#2438 ·
Mantenedores costumam responder em até 15 dias