Ao vivo 18/11 · Turma 318 nov às 19:00 MSK — aula prática gratuita de agentes de IA · Turma 3 ao vivo começa 23/11Aula 18/11 →Turma 3 (23/11)
LançamentoAnálise · No radarHabr AI→ original

Medições de 46 operações do .NET: agente Copilot adicionou queda de 16% no primeiro resolve de DI

O autor executou 46 operações de DI, configuração, logging, cache e EF Core em seis versões do .NET: 30 rodadas, runtime fixado. Duas quedas de desempenho no 11 RC puderam ser rastreadas até commits. A maior, ×2,4 no binding de configuração, foi introduzida por uma pessoa com uma única linha; a segunda, +16% no primeiro resolve em DI, veio de um PR do agente Copilot.

Processado por IA de Habr AI; editado por Hamidun News
Medições de 46 operações do .NET: agente Copilot adicionou queda de 16% no primeiro resolve de DI
Fonte: Habr AI. Colagem: Hamidun News.
Ouvir artigo
Ficha técnica e números-chave
ParâmetroDados
Fonte originalHabr AI ↗
Editor-chefe
Binding de POCO no 11 RC61 → 145 µs por causa de uma única verificação de atributo
PR do agente contra deadlock+0,9 µs no primeiro resolve em DI
Alternativao gerador de código-fonte entrega 12 µs contra 29 µs no 10.0

A discussão sobre se a IA estraga o código costuma se basear em impressões. O autor deste material decidiu medir. Ele definiu um ponto de partida: o .NET 7 foi lançado três semanas antes do ChatGPT e foi a última versão escrita antes da era dos assistentes. Desde maio de 2025, o Copilot coding agent atua no dotnet/runtime: até o fim de outubro de 2026 ele havia aberto 1734 pull requests, dos quais 1207 foram mesclados.

Como foi medido

O runtime foi fixado no .NET 10.0.11 e apenas os pacotes NuGet Microsoft.Extensions.* da versão 6 à 11 e o EF Core da 6 à 10 foram alterados. Assim, as melhorias de JIT e GC não afetam o resultado. No total: 46 operações, 30 rodadas, cada cenário em um processo separado em núcleos dedicados, com a ordem das versões embaralhada. O veredito «mais rápido» ou «mais lento» só é dado se todo o intervalo de confiança de 95% estiver além de um limiar de 5%.

O primeiro quadro é ambíguo. Versão 10.0 contra 7.0: 9 operações mais rápidas, 13 mais lentas e 10 dentro do ruído. O código já aquecido ficou de 14% a 35% mais rápido: LoggerMessage.Define foi de 377 para 244 ns, e DetectChanges com 10 mil entidades, de 6,1 para 4,3 ms. Em contrapartida, as primeiras chamadas e a criação de objetos ficaram de 39% a 64% mais caras: a primeira consulta do EF subiu de 996 para 1162 ms. Para um serviço de longa duração a troca compensa; para processos curtos e cold start, não.

A maioria das mudanças, 19 de 46, ocorreu no passo para a 8.0, ou seja, a primeira versão após o ChatGPT. Mas o autor ressalva com honestidade que as medições mostram o que mudou, não por quê. Além disso, esse passo inclui a troca do alvo de compilação de net7.0 para net8.0.

Onde estava o agente

No histórico do Git entre v7.0.20 e v10.0.14 foram encontrados 113 commits em DI e cache, nenhum do agente. Na janela até o 11 RC o agente apareceu: por exemplo, 3 de 11 alterações em métodos críticos de DI e cache. Uma ressalva importante: um commit do agente significa «PR aberto pelo agente», e não «escrito sem humano». Todos os PRs passam por revisão humana, e um assistente de IDE simplesmente não aparece no Git.

Duas quedas no 11 RC

A maior: o binding de um POCO de 50 campos subiu de 61 para 145 µs, e o IOptionsSnapshot em um novo scope, de 52 para 136 µs. A causa estava em uma única linha do PR #126396 com o atributo [ConfigurationIgnore]: property.IsDefined(...)

é executado para cada propriedade a cada binding. O autor compilou o binder a partir do código-fonte, trocou a expressão por false e substituiu uma DLL: o tempo voltou a 60 µs. O maior custo vem da sobrecarga com inherit: true por padrão.

O PR foi escrito por uma pessoa. Os mantenedores reconheceram a regressão, mas lembraram que para caminhos críticos se recomenda o gerador de código-fonte. A correção para o 11.

0 está prometida, mas não garantida: o issue está vinculado ao milestone 12.0.0.

A segunda queda é menor: o primeiro resolve em DI aumentou 16,5%. O bisect de commits apontou o culpado, o PR do agente #124331, que corrige um deadlock em dependências circulares via factories. Agora o VisitRootCache mantém um HashSet ThreadStatic, o que custa cerca de 0,9 µs por primeiro resolve. Reverter apenas esse PR devolve o tempo ao nível do 10.0. O commit não afeta singleton e scoped já aquecidos, nem a construção do provider. O autor considera o preço razoável por um deadlock corrigido.

O que fazer

  • Se você está no 11 RC e faz muito binding de configuração, ative o gerador de código-fonte (EnableConfigurationBindingGenerator): 12 µs contra 29 µs no 10.0.
  • Em vez de IOptionsSnapshot, onde não é preciso atualização dentro da requisição, use IOptionsMonitor.
  • Fique atento ao cold start: ele ficou mais caro em vários pontos.

Limitações: trata-se de um release candidate, as medições foram feitas em um único notebook, e a trilha principal usa o build 11.0 no runtime .NET 10. A conclusão sobre IA é modesta: nenhuma das duas quedas prova que a IA piora o código. Uma foi introduzida por uma pessoa; a outra, por um agente em troca da correção de um bug real. Mas uma metodologia em que regressões são detectadas por medições e bisect vale mais do que qualquer discussão.

História

Perguntas frequentes sobre a notícia

Como foi medido?

O runtime foi fixado no .NET 10.0.11 e apenas os pacotes NuGet Microsoft.Extensions. da versão 6 à 11 e o EF Core da 6 à 10 foram alterados. Assim, as melhorias de JIT e GC não afetam o resultado. No total: 46 operações, 30 rodadas, cada cenário em um processo separado em núcleos dedicados, com a ordem das versões embaralhada. O veredito «mais rápido» ou «mais lento» só é dado se todo o intervalo de confiança de 95% estiver além de um limiar de 5%. O primeiro quadro é ambíguo.

Onde estava o agente?

No histórico do Git entre v7.0.20 e v10.0.14 foram encontrados 113 commits em DI e cache, nenhum do agente. Na janela até o 11 RC o agente apareceu: por exemplo, 3 de 11 alterações em métodos críticos de DI e cache. Uma ressalva importante: um commit do agente significa «PR aberto pelo agente», e não «escrito sem humano». Todos os PRs passam por revisão humana, e um assistente de IDE simplesmente não aparece no Git.

O que se sabe sobre Duas quedas no 11 RC?

A maior: o binding de um POCO de 50 campos subiu de 61 para 145 µs, e o IOptionsSnapshot em um novo scope, de 52 para 136 µs. A causa estava em uma única linha do PR #126396 com o atributo [ConfigurationIgnore]: property.IsDefined(...) é executado para cada propriedade a cada binding. O autor compilou o binder a partir do código-fonte, trocou a expressão por false e substituiu uma DLL: o tempo voltou a 60 µs. O maior custo vem da sobrecarga com inherit: true por padrão. O PR foi escrito por uma pessoa.

ZK
Zhemal Khamidun — CPO da Alpina Digital, gerente de produto do AlpinaGPT. Cria produtos de IA desde 2019. O Hamidun News é um projeto pessoal que virou um agregador em produção com mais de 6.000 leitores.
✦ Hands-On AI Engineering · Hamidun Academy

Build & Ship Production AI Agents Without Boilerplate Code

Start your free 72-hour trial at Hamidun Academy (academy.hamidun.com) — interactive lessons on Claude Code & Cursor, live Tech Radar, and production agent templates.

Start 72h Free Trial →Vibe-Coding Intensive
O que você acha?
Carregando comentários…