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
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.
- 12 de nov. de 2026Jensen Huang deixa o cargo de CEO da Nvidia: empresa perde US$ 1,4 trilhão em duas semanas
- 12 de nov. de 2026Oito países, OpenAI e Anthropic prometem um «botão de desligar» para modelos de IA, mas sem prazos nem multas
- 12 de nov. de 2026Microsoft patenteia treino de IA em placas de vídeo ociosas com pagamento pelo trabalho
- 12 de nov. de 2026Pesquisador com um notebook e o Claude encontrou mais de 100 falhas no código de sites do governo britânico
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.
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.
O essencial da IA — uma vez por semana
Sete histórias que realmente importaram, escolhidas a dedo. Sem ruído nem releases.
Pronto! Verifique seu e-mail para a confirmação.