{"id":2639,"date":"2022-09-13T08:54:06","date_gmt":"2022-09-13T11:54:06","guid":{"rendered":"https:\/\/mig.antlia.com.br\/?p=2639"},"modified":"2023-04-12T11:20:09","modified_gmt":"2023-04-12T14:20:09","slug":"melhorias-de-desempenho-no-net-7","status":"publish","type":"post","link":"https:\/\/antlia.com.br\/en\/arquivos\/2639","title":{"rendered":"Melhorias de desempenho no .NET 7"},"content":{"rendered":"<p>Segundo postagem no blog oficial da Microsoft em 31 de agosto de 2022, o desenvolvedor Stephen Toub publicou uma atualiza\u00e7\u00e3o de desempenho no .NET 7.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-2744 size-full\" src=\"http:\/\/mig.antlia.com.br\/wp-content\/uploads\/2022\/09\/1-3.png\" alt=\"Postagem de Stephen Toub\" width=\"387\" height=\"243\" srcset=\"https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/1-3.png 387w, https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/1-3-300x188.png 300w\" sizes=\"(max-width: 387px) 100vw, 387px\" \/><\/p>\n<p>O desempenho \u00e9 o foco principal do desenvolvimento, sejam recursos criados explicitamente para ele ou recursos n\u00e3o relacionados que ainda s\u00e3o projetados e implementados com o desempenho em mente. E agora com a atualiza\u00e7\u00e3o do .NET 7 chegando \u00e9 um bom momento para discutir sobre isso.<\/p>\n<h3 id=\"on-stack-replacement\"><span class=\"\">Substitui\u00e7\u00e3o na pilha<\/span><\/h3>\n<p>A substitui\u00e7\u00e3o na pilha (OSR) \u00e9 um dos recursos mais interessantes para o .NET 7.<\/p>\n<p>A ideia por tr\u00e1s \u00e9 que um m\u00e9todo pode ser substitu\u00eddo n\u00e3o apenas entre invoca\u00e7\u00f5es, mas mesmo enquanto est\u00e1 na pilha e em execu\u00e7\u00e3o. Al\u00e9m do c\u00f3digo de camada zero ser instrumentado para contagens de chamadas, os loops s\u00e3o instrumentados para contagens de itera\u00e7\u00e3o. Quando as itera\u00e7\u00f5es ultrapassam um certo limite, o JIT compila uma nova vers\u00e3o altamente otimizada desse m\u00e9todo, transfere todo o estado local\/registro da invoca\u00e7\u00e3o atual para a nova invoca\u00e7\u00e3o e, em seguida, salta para o local apropriado no novo m\u00e9todo.<\/p>\n<p>Agora no .NET 7, podemos evitar em grande parte as compensa\u00e7\u00f5es entre inicializa\u00e7\u00e3o e taxa de transfer\u00eancia, pois o OSR permite que a compila\u00e7\u00e3o em camadas seja aplicada a todos os m\u00e9todos, mesmo aqueles de longa dura\u00e7\u00e3o. V\u00e1rios PRs foram habilitados para isso, incluindo muitos nos \u00faltimos anos, mas toda a funcionalidade foi desativada nos bits de envio.<\/p>\n<p>Gra\u00e7as a melhorias como dotnet\/runtime#62831 que implementou suporte para OSR no Arm64 (anteriormente apenas suporte x64 era implementado), e dotnet\/runtime#63406 e dotnet\/runtime#65609 que revisou como as importa\u00e7\u00f5es e ep\u00edlogos OSR s\u00e3o tratados, dotnet\/runtime #65675 habilita OSR e como resultado DOTNET_TC_QuickJitForLoops por padr\u00e3o.<\/p>\n<p>Foi tamb\u00e9m melhorada a taxa de transfer\u00eancia. Embora a compila\u00e7\u00e3o em camadas tenha sido originalmente concebida como uma forma de otimizar a inicializa\u00e7\u00e3o sem prejudicar a taxa de transfer\u00eancia, ela se tornou muito mais do que isso. H\u00e1 v\u00e1rias coisas que o JIT pode aprender sobre um m\u00e9todo durante o n\u00edvel 0 que pode ser usado para o n\u00edvel 1. Por exemplo, o pr\u00f3prio fato de que o c\u00f3digo de camada 0 executado significa que qualquer m\u00e9todo static acessado pelo m\u00e9todo principal ser\u00e1 inicializado a cada execu\u00e7\u00e3o do c\u00f3digo de camada 1.<\/p>\n<h3>PGO &#8211; Otimiza\u00e7\u00e3o guiada por perfil<\/h3>\n<p>O PGO (Profile-guided optimization) existe h\u00e1 muito tempo, em v\u00e1rias linguagens e compiladores. A ideia b\u00e1sica \u00e9 voc\u00ea compilar seu aplicativo, pedindo ao compilador para injetar instrumenta\u00e7\u00e3o no aplicativo para rastrear v\u00e1rias informa\u00e7\u00f5es interessantes. Em seguida, voc\u00ea coloca seu aplicativo em pr\u00e1tica, executando v\u00e1rios cen\u00e1rios comuns, fazendo com que essa instrumenta\u00e7\u00e3o identifique o que acontece quando o aplicativo \u00e9 executado e os resultados s\u00e3o salvos.<\/p>\n<p>O aplicativo \u00e9 ent\u00e3o recompilado, alimentando esses resultados de instrumenta\u00e7\u00e3o de volta ao compilador e permitindo que ele otimize o aplicativo exatamente como se espera que seja usado. Essa abordagem ao PGO \u00e9 chamada de \u201cPGO est\u00e1tico\u201d, pois todas as informa\u00e7\u00f5es s\u00e3o coletadas antes da implanta\u00e7\u00e3o real, e \u00e9 algo que o .NET vem fazendo de v\u00e1rias formas h\u00e1 anos.<\/p>\n<p>O PGO din\u00e2mico aproveita a compila\u00e7\u00e3o em camadas.\u00a0Observei que o JIT instrumenta o c\u00f3digo de camada 0 para rastrear quantas vezes o m\u00e9todo \u00e9 chamado ou, no caso de loops, quantas vezes o loop \u00e9 executado.\u00a0Ele pode instrumentaliz\u00e1-lo para outras coisas tamb\u00e9m.\u00a0Por exemplo, ele pode rastrear exatamente quais tipos concretos s\u00e3o usados \u200b\u200bcomo destino de um despacho de interface e, em seguida, na camada 1, especializar o c\u00f3digo para esperar os tipos mais comuns (isso \u00e9 chamado de \u201cdesvirtualiza\u00e7\u00e3o protegida\u201d ou GDV).\u00a0Voc\u00ea pode ver isso neste pequeno exemplo<\/p>\n<p>Primeiro, o PGO agora funciona com OSR, gra\u00e7as a melhorias como\u00a0dotnet\/runtime#61453\u00a0.\u00a0Isso \u00e9 um grande neg\u00f3cio, pois significa que m\u00e9todos quentes de longa execu\u00e7\u00e3o que fazem esse tipo de envio de interface (que s\u00e3o bastante comuns) podem obter esses tipos de otimiza\u00e7\u00f5es de desvirtualiza\u00e7\u00e3o\/inlining.\u00a0Em segundo lugar, embora o PGO n\u00e3o esteja atualmente ativado por padr\u00e3o, facilitamos muito a ativa\u00e7\u00e3o.<\/p>\n<p>Agora \u00e9 poss\u00edvel simplesmente colocar em seu .csproj e ter\u00e1 o mesmo efeito que se voc\u00ea definir antes de cada invoca\u00e7\u00e3o do aplicativo, habilitando o PGO din\u00e2mico. Portanto, se voc\u00ea quiser que a totalidade das bibliotecas principais tamb\u00e9m empregue PGO din\u00e2mico, precisar\u00e1 definir. Em terceiro lugar, no entanto, o PGO din\u00e2mico foi ensinado a instrumentar e otimizar adicionais.<\/p>\n<p>O PGO j\u00e1 sabia instrumentar o despacho virtual.\u00a0Agora no .NET 7, gra\u00e7as em grande parte ao\u00a0dotnet\/runtime#68703\u00a0, pode fazer isso para delegados (pelo menos para delegados a m\u00e9todos de inst\u00e2ncia).<\/p>\n<h3>Elimina\u00e7\u00e3o de verifica\u00e7\u00e3o de limites<\/h3>\n<p>Uma das coisas que torna o .NET atraente \u00e9 sua seguran\u00e7a. O tempo de execu\u00e7\u00e3o protege o acesso a arrays, strings e spans de forma que voc\u00ea n\u00e3o possa corromper a mem\u00f3ria acidentalmente ao sair de uma das extremidades. Se voc\u00ea fizer isso, em vez de ler\/escrever mem\u00f3ria arbitr\u00e1ria, voc\u00ea obter\u00e1 exce\u00e7\u00f5es atrav\u00e9s do JIT, inserindo verifica\u00e7\u00f5es de limites toda vez que uma dessas estruturas de dados \u00e9 indexada.<\/p>\n<p>Sem verifica\u00e7\u00f5es de limites, o que \u00e9 mais facilmente visto pela falta do indicador call no final do m\u00e9todo. Com esta melhoria, o JIT \u00e9 capaz de entender o impacto de certas opera\u00e7\u00f5es de multiplica\u00e7\u00e3o e deslocamento e suas rela\u00e7\u00f5es com os limites da estrutura de dados.<\/p>\n<p>Com essa melhoria, \u00e9 poss\u00edvel visualizar:<\/p>\n<ul>\n<li>O comprimento do array de resultado<\/li>\n<li>O loop que est\u00e1 iterando de 0 at\u00e9 aquele limite superior exclusivo<\/li>\n<\/ul>\n<p>Foi otimizado igualmente a elimina\u00e7\u00e3o de verifica\u00e7\u00f5es de limites ao lidar com strings constantes e spans inicializados de m\u00e9todos est\u00e1ticos.<\/p>\n<h3><strong>Regex<\/strong><\/h3>\n<p>Antes do .NET 5, o Regex do .NET estava praticamente intocado. No .NET 5, foi atualizado para estar no mesmo n\u00edvel ou melhor do que v\u00e1rias outras implementa\u00e7\u00f5es do setor do ponto de vista do desempenho. O .NET 7 d\u00e1 alguns saltos significativos a partir disso.<\/p>\n<p>Abaixo um exemplo de aplica\u00e7\u00e3o Regex que exibe a seguinte sa\u00edda:<\/p>\n<p><em>Duplica &#8216;This&#8217; na posi\u00e7\u00e3o 0 e duplica &#8216;a&#8217; na posi\u00e7\u00e3o 66<\/em><\/p>\n<p>[code]<\/p>\n<p>using System;<br \/>\nusing System.Text.RegularExpressions;<\/p>\n<p>public class Class1<br \/>\n{<br \/>\npublic static void Main()<br \/>\n{<br \/>\nstring pattern = @&quot;\\b(\\w+?)\\s\\1\\b&quot;;<br \/>\nstring input = &quot;This this is a nice day. What about this? This tastes good. I saw a a dog.&quot;;<br \/>\nforeach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))<br \/>\nConsole.WriteLine(&quot;{0} (duplicates &#8216;{1}&#8217;) at position {2}&quot;,<br \/>\nmatch.Value, match.Groups[1].Value, match.Index);<br \/>\n}<br \/>\n}<br \/>\n\/\/ The example displays the following output:<br \/>\n\/\/ This this (duplicates &#8216;This&#8217;) at position 0<br \/>\n\/\/ a a (duplicates &#8216;a&#8217;) at position 66<\/p>\n<p>[\/code]<\/p>\n<p>Um dos novos recursos maiores do Regex, foi a nova implementa\u00e7\u00e3o. Na atualiza\u00e7\u00e3o atual \u00e9 poss\u00edvel alternar o processamento para o uso de um novo mecanismo baseado em aut\u00f4matos finitos.<\/p>\n<p>Ele tem dois modos principais de execu\u00e7\u00e3o, um que depende de DFAs (aut\u00f4matos finitos determin\u00edsticos) e outro que depende de NFAs (aut\u00f4matos finitos n\u00e3o determin\u00edsticos). Ambas as implementa\u00e7\u00f5es fornecem uma garantia muito valiosa: o tempo de processamento \u00e9 linear no comprimento da entrada. Considerando que um mecanismo de retrocesso (que \u00e9 o que usa se n\u00e3o for especificado) pode atingir uma situa\u00e7\u00e3o conhecida como \u201cretrocesso catastr\u00f3fico\u201d, onde express\u00f5es complexas combinadas com entradas problem\u00e1ticas podem resultar em processamento exponencial no comprimento da entrada.<\/p>\n<p>O Regex agora s\u00f3 far\u00e1 uma quantidade de trabalho constante amortizada por caractere na entrada. No caso de um DFA, essa constante \u00e9 muito pequena. J\u00e1 em um NFA, essa constante pode ser muito maior, com base na complexidade do padr\u00e3o. De todo modo, para qualquer padr\u00e3o o trabalho ainda \u00e9 linear no comprimento da entrada.<\/p>\n<p>Essa implementa\u00e7\u00e3o \u00e9 baseada na no\u00e7\u00e3o de derivadas de express\u00f5es regulares, um conceito que existe h\u00e1 d\u00e9cadas (o termo foi originalmente cunhado em um artigo de Janusz Brzozowski na d\u00e9cada de 1960) e que foi significativamente avan\u00e7ado para essa implementa\u00e7\u00e3o. As derivadas de Regex formam a base de como os aut\u00f4matos usados \u200b\u200bpara processar a entrada s\u00e3o constru\u00eddos.<\/p>\n<p>A ideia em seu n\u00facleo \u00e9 bastante simples: pegue um Regex e processe um \u00fanico caractere&#8230; qual \u00e9 o novo Regex que voc\u00ea obt\u00e9m para descrever o que resta ap\u00f3s o processamento desse caractere? Essa \u00e9 a derivada. Por exemplo, dado o Regex para corresponder a tr\u00eas caracteres de palavra, se voc\u00ea aplicar isso ao pr\u00f3ximo caractere de entrada &#8216;a&#8217;, isso remover\u00e1 o primeiro, deixando-nos com a.<\/p>\n<h3>Novas APIs<\/h3>\n<p>As novas APIs foram habilitadas principalmente porque suportam entradas nos mecanismos Regex .<\/p>\n<p>Na atualiza\u00e7\u00e3o atual, foi disponibilizado Regex para a era baseada em span do .NET, superando uma limita\u00e7\u00e3o significativa Regex desde que os spans foram introduzidos no .NET Core 2.1. Regex tem sido historicamente baseado no processamento de entradas e esse fato permeia o design e a implementa\u00e7\u00e3o, incluindo as APIs expostas para o modelo de extensibilidade usado no .NET Framework ( agora est\u00e1 obsoleto e nunca foi funcional no .NET Core).<\/p>\n<p>Uma sutileza que depende da natureza da entrada \u00e9 como as informa\u00e7\u00f5es de correspond\u00eancia s\u00e3o retornadas aos chamadores. Retorna um objeto que representa a primeira correspond\u00eancia na entrada e esse objeto exp\u00f5e um m\u00e9todo que permite mover para a pr\u00f3xima correspond\u00eancia. Isso significa que o objeto precisa armazenar uma refer\u00eancia \u00e0 entrada para que possa ser realimentado no mecanismo correspondente como parte de tal chamada.<\/p>\n<p>Todos os mecanismos Regex dependem de uma classe base que armazena nele todo o estado necess\u00e1rio para alimentar os m\u00e9todos e que comp\u00f5em a l\u00f3gica de correspond\u00eancia real para as express\u00f5es regulares (esses m\u00e9todos cont\u00eam todo o c\u00f3digo principal para realizar a correspond\u00eancia).<\/p>\n<p>Uma otimiza\u00e7\u00e3o ocorreu para pular posi\u00e7\u00f5es de entrada anteriores que n\u00e3o poderiam iniciar uma correspond\u00eancia.<\/p>\n<p>Foi adicionado um novo m\u00e9todo virtual chamado Scanque. Este n\u00e3o precisa mais acessar os membros protegidos. Agora com o m\u00e9todo ativo \u00e9 poss\u00edvel apenas receber o span, j\u00e1 fatiado para a regi\u00e3o de entrada e, consequentemente s\u00e3o processadas as entradas.<\/p>\n<p>Uma das coisas legais sobre isso, do ponto de vista do desempenho, \u00e9 que permite que o JIT fa\u00e7a um trabalho melhor ao reduzir v\u00e1rias despesas gerais, principalmente em torno da verifica\u00e7\u00e3o de limites. Quando a l\u00f3gica \u00e9 implementada em termos de string de entrada, o mecanismo tamb\u00e9m recebe o in\u00edcio e o fim da regi\u00e3o da entrada a ser processada (j\u00e1 que o desenvolvedor poderia ter chamado um m\u00e9todo para processar apenas uma substring). Obviamente, a l\u00f3gica de correspond\u00eancia do mecanismo \u00e9 muito mais complicada do que isso, mas, simplificando, imagine que a totalidade do mecanismo fosse apenas um loop sobre a entrada.<\/p>\n<h3>Loops e retrocessos<\/h3>\n<p>A manipula\u00e7\u00e3o de loops foi significativamente aprimorada, tanto no que diz respeito a process\u00e1-los mais rapidamente quanto no que diz respeito ao menor retrocesso.<\/p>\n<p>Com os loops h\u00e1 duas principais melhorias:<\/p>\n<ul>\n<li>Rapidez para consumir todos os elementos que correspondem ao loop<\/li>\n<li>Rapidez para devolver elementos que podem ser necess\u00e1rios como parte do retrocesso para o restante da express\u00e3o para corresponder<\/li>\n<\/ul>\n<p>Com loops lentos, foi levado em conta principalmente o retrocesso, que \u00e9 a dire\u00e7\u00e3o para frente (haja vista o fato de que os loops consomem como parte do retrocesso em vez de devolver como parte do retrocesso). Agora tanto no compilador quanto no gerador de c\u00f3digo-fonte \u00e9 feito o uso de todas as variantes para acelerar essas buscas.<\/p>\n<p>Por exemplo, em um loop simples, a dire\u00e7\u00e3o para frente desse loop implica consumir todos os caracteres at\u00e9 a pr\u00f3xima linha. Ent\u00e3o, como parte do retrocesso, em vez de desistir de um caractere de cada vez, \u00e9 poss\u00edvel encontrar o pr\u00f3ximo local vi\u00e1vel que possa corresponder ao restante do padr\u00e3o.<\/p>\n<p><strong>Refer\u00eancia<\/strong><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/performance_improvements_in_net_7\/\">Devblogs.microsoft.com\/performance_improvements_in_net_7\/<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Segundo postagem no blog oficial da Microsoft em 31 de agosto de 2022, o desenvolvedor Stephen Toub publicou uma atualiza\u00e7\u00e3o de desempenho no .NET 7. O desempenho \u00e9 o foco principal do desenvolvimento, sejam recursos criados explicitamente para ele ou recursos n\u00e3o relacionados que ainda s\u00e3o projetados e implementados com o desempenho em mente. E [&hellip;]<\/p>","protected":false},"author":16,"featured_media":2746,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jet_sm_ready_style":"","_jet_sm_style":"","_jet_sm_controls_values":"","_jet_sm_fonts_collection":"","_jet_sm_fonts_links":"","footnotes":""},"categories":[73],"tags":[71,174,173,140],"class_list":["post-2639","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artigos","tag-net","tag-desempenho","tag-melhorias","tag-microsoft"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Melhorias de desempenho no .NET 7 - Antlia<\/title>\n<meta name=\"description\" content=\"Buscando por Melhorias de desempenho no .NET 7? Saiba tudo sobre Melhorias de desempenho no .NET 7 no Blog da Antlia.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/antlia.com.br\/en\/arquivos\/2639\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Melhorias de desempenho no .NET 7 - Antlia\" \/>\n<meta property=\"og:description\" content=\"Buscando por Melhorias de desempenho no .NET 7? Saiba tudo sobre Melhorias de desempenho no .NET 7 no Blog da Antlia.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/antlia.com.br\/en\/arquivos\/2639\/\" \/>\n<meta property=\"og:site_name\" content=\"Antlia\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/antlia.consultoriaetecnologia\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-13T11:54:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-12T14:20:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/Post-Net7.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"627\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlos Jesus\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlos Jesus\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639\"},\"author\":{\"name\":\"Carlos Jesus\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#\\\/schema\\\/person\\\/31eaf0f03ce818b666e8e7a0a32a413e\"},\"headline\":\"Melhorias de desempenho no .NET 7\",\"datePublished\":\"2022-09-13T11:54:06+00:00\",\"dateModified\":\"2023-04-12T14:20:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639\"},\"wordCount\":2052,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/antlia.com.br\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Post-Net7.png\",\"keywords\":[\".net\",\"desempenho\",\"Melhorias\",\"microsoft\"],\"articleSection\":[\"Artigos\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639\",\"url\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639\",\"name\":\"Melhorias de desempenho no .NET 7 - Antlia\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/antlia.com.br\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Post-Net7.png\",\"datePublished\":\"2022-09-13T11:54:06+00:00\",\"dateModified\":\"2023-04-12T14:20:09+00:00\",\"description\":\"Buscando por Melhorias de desempenho no .NET 7? Saiba tudo sobre Melhorias de desempenho no .NET 7 no Blog da Antlia.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#primaryimage\",\"url\":\"https:\\\/\\\/antlia.com.br\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Post-Net7.png\",\"contentUrl\":\"https:\\\/\\\/antlia.com.br\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Post-Net7.png\",\"width\":1200,\"height\":627,\"caption\":\"Melhorias de desempenho no dot Net 7\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/arquivos\\\/2639#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/antlia.com.br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Melhorias de desempenho no .NET 7\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/\",\"name\":\"Antlia\",\"description\":\"Desenvolvimento de Software e Gamifica\u00e7\u00e3o\",\"publisher\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#organization\",\"name\":\"Antlia \u2013 Desenvolvimento de Software e Gamifica\u00e7\u00e3o\",\"url\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/antlia.com.br\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/LOGO_VETOR-01.png\",\"contentUrl\":\"https:\\\/\\\/antlia.com.br\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/LOGO_VETOR-01.png\",\"width\":3508,\"height\":2481,\"caption\":\"Antlia \u2013 Desenvolvimento de Software e Gamifica\u00e7\u00e3o\"},\"image\":{\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/antlia.consultoriaetecnologia\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/antlia_2\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/#\\\/schema\\\/person\\\/31eaf0f03ce818b666e8e7a0a32a413e\",\"name\":\"Carlos Jesus\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9c6febc02bb400288e65a46b6ab1aa3942b3bf2290f03a1451ce525cf8d5939b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9c6febc02bb400288e65a46b6ab1aa3942b3bf2290f03a1451ce525cf8d5939b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9c6febc02bb400288e65a46b6ab1aa3942b3bf2290f03a1451ce525cf8d5939b?s=96&d=mm&r=g\",\"caption\":\"Carlos Jesus\"},\"sameAs\":[\"https:\\\/\\\/antlia.com.br\\\/\"],\"url\":\"https:\\\/\\\/antlia.com.br\\\/en\\\/arquivos\\\/author\\\/carlos-jesus\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Melhorias de desempenho no .NET 7 - Antlia","description":"Buscando por Melhorias de desempenho no .NET 7? Saiba tudo sobre Melhorias de desempenho no .NET 7 no Blog da Antlia.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/antlia.com.br\/en\/arquivos\/2639\/","og_locale":"en_US","og_type":"article","og_title":"Melhorias de desempenho no .NET 7 - Antlia","og_description":"Buscando por Melhorias de desempenho no .NET 7? Saiba tudo sobre Melhorias de desempenho no .NET 7 no Blog da Antlia.","og_url":"https:\/\/antlia.com.br\/en\/arquivos\/2639\/","og_site_name":"Antlia","article_publisher":"https:\/\/www.facebook.com\/antlia.consultoriaetecnologia\/","article_published_time":"2022-09-13T11:54:06+00:00","article_modified_time":"2023-04-12T14:20:09+00:00","og_image":[{"width":1200,"height":627,"url":"https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/Post-Net7.png","type":"image\/png"}],"author":"Carlos Jesus","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Carlos Jesus","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/antlia.com.br\/arquivos\/2639#article","isPartOf":{"@id":"https:\/\/antlia.com.br\/arquivos\/2639"},"author":{"name":"Carlos Jesus","@id":"https:\/\/antlia.com.br\/en\/#\/schema\/person\/31eaf0f03ce818b666e8e7a0a32a413e"},"headline":"Melhorias de desempenho no .NET 7","datePublished":"2022-09-13T11:54:06+00:00","dateModified":"2023-04-12T14:20:09+00:00","mainEntityOfPage":{"@id":"https:\/\/antlia.com.br\/arquivos\/2639"},"wordCount":2052,"commentCount":0,"publisher":{"@id":"https:\/\/antlia.com.br\/en\/#organization"},"image":{"@id":"https:\/\/antlia.com.br\/arquivos\/2639#primaryimage"},"thumbnailUrl":"https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/Post-Net7.png","keywords":[".net","desempenho","Melhorias","microsoft"],"articleSection":["Artigos"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/antlia.com.br\/arquivos\/2639#respond"]}]},{"@type":"WebPage","@id":"https:\/\/antlia.com.br\/arquivos\/2639","url":"https:\/\/antlia.com.br\/arquivos\/2639","name":"Melhorias de desempenho no .NET 7 - Antlia","isPartOf":{"@id":"https:\/\/antlia.com.br\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/antlia.com.br\/arquivos\/2639#primaryimage"},"image":{"@id":"https:\/\/antlia.com.br\/arquivos\/2639#primaryimage"},"thumbnailUrl":"https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/Post-Net7.png","datePublished":"2022-09-13T11:54:06+00:00","dateModified":"2023-04-12T14:20:09+00:00","description":"Buscando por Melhorias de desempenho no .NET 7? Saiba tudo sobre Melhorias de desempenho no .NET 7 no Blog da Antlia.","breadcrumb":{"@id":"https:\/\/antlia.com.br\/arquivos\/2639#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/antlia.com.br\/arquivos\/2639"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/antlia.com.br\/arquivos\/2639#primaryimage","url":"https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/Post-Net7.png","contentUrl":"https:\/\/antlia.com.br\/wp-content\/uploads\/2022\/09\/Post-Net7.png","width":1200,"height":627,"caption":"Melhorias de desempenho no dot Net 7"},{"@type":"BreadcrumbList","@id":"https:\/\/antlia.com.br\/arquivos\/2639#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/antlia.com.br\/"},{"@type":"ListItem","position":2,"name":"Melhorias de desempenho no .NET 7"}]},{"@type":"WebSite","@id":"https:\/\/antlia.com.br\/en\/#website","url":"https:\/\/antlia.com.br\/en\/","name":"Antlia","description":"Desenvolvimento de Software e Gamifica\u00e7\u00e3o","publisher":{"@id":"https:\/\/antlia.com.br\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/antlia.com.br\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/antlia.com.br\/en\/#organization","name":"Antlia \u2013 Desenvolvimento de Software e Gamifica\u00e7\u00e3o","url":"https:\/\/antlia.com.br\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/antlia.com.br\/en\/#\/schema\/logo\/image\/","url":"https:\/\/antlia.com.br\/wp-content\/uploads\/2024\/05\/LOGO_VETOR-01.png","contentUrl":"https:\/\/antlia.com.br\/wp-content\/uploads\/2024\/05\/LOGO_VETOR-01.png","width":3508,"height":2481,"caption":"Antlia \u2013 Desenvolvimento de Software e Gamifica\u00e7\u00e3o"},"image":{"@id":"https:\/\/antlia.com.br\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/antlia.consultoriaetecnologia\/","https:\/\/www.linkedin.com\/company\/antlia_2\/"]},{"@type":"Person","@id":"https:\/\/antlia.com.br\/en\/#\/schema\/person\/31eaf0f03ce818b666e8e7a0a32a413e","name":"Carlos Jesus","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/9c6febc02bb400288e65a46b6ab1aa3942b3bf2290f03a1451ce525cf8d5939b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9c6febc02bb400288e65a46b6ab1aa3942b3bf2290f03a1451ce525cf8d5939b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9c6febc02bb400288e65a46b6ab1aa3942b3bf2290f03a1451ce525cf8d5939b?s=96&d=mm&r=g","caption":"Carlos Jesus"},"sameAs":["https:\/\/antlia.com.br\/"],"url":"https:\/\/antlia.com.br\/en\/arquivos\/author\/carlos-jesus"}]}},"_links":{"self":[{"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/posts\/2639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/comments?post=2639"}],"version-history":[{"count":0,"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/posts\/2639\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/media\/2746"}],"wp:attachment":[{"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/media?parent=2639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/categories?post=2639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/antlia.com.br\/en\/wp-json\/wp\/v2\/tags?post=2639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}