{"id":495,"date":"2021-03-01T09:16:27","date_gmt":"2021-03-01T12:16:27","guid":{"rendered":"https:\/\/millerdantas.wordpress.com\/?p=495"},"modified":"2021-03-09T22:08:24","modified_gmt":"2021-03-10T01:08:24","slug":"sobre-otimizacao-em-aplicacoes-net-parte-2","status":"publish","type":"post","link":"https:\/\/millerdantas.com\/blog\/2021\/03\/01\/sobre-otimizacao-em-aplicacoes-net-parte-2\/","title":{"rendered":"Sobre otimiza\u00e7\u00e3o em aplica\u00e7\u00f5es .Net &#8211; Parte 2"},"content":{"rendered":"\n<p>Bom, continuando o post anterior: <a href=\"https:\/\/millerdantas.wordpress.com\/2021\/02\/28\/sobre-otimizacao-em-aplicacoes-net-parte-1\/\">Sobre Otimiza\u00e7\u00e3o em aplica\u00e7\u00f5es .Net &#8211; Parte 1<\/a>, se voc\u00ea n\u00e3o leu, vai l\u00e1, <br>porque eu estou tentando ser o mais detalhista poss\u00edvel.<\/p>\n\n\n\n<p>N\u00f3s paramos no seguinte cen\u00e1rio:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/millerdantas.files.wordpress.com\/2021\/03\/image.png?w=523\" alt=\"\" class=\"wp-image-499\"\/><\/figure>\n\n\n\n<p>eu dei uma lida no c\u00f3digo inteiro e n\u00e3o particularmente n\u00e3o vi nada gritante muito expl\u00edcito, sendo assim, j\u00e1 posso come\u00e7ar fazer o que acho mais conveniente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quebrando o problema em partes.<\/h2>\n\n\n\n<p>Bom, o c\u00f3digo \u00e9 grande o suficiente para que minha efici\u00eancia seja baixa, ent\u00e3o vamos separar em 5 pontos.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Carregar os mods.<\/li><li>Identificar os conflitos<\/li><li>Atualizar a lista de conflitos<\/li><li>Atualiza\u00e7\u00e3o da GUI<\/li><li>Feedback via progress Bar<\/li><\/ul>\n\n\n\n<p>Destes pontos eu preciso identificar aonde est\u00e1 o maior tempo <\/p>\n\n\n\n<p>O que se resume em :<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-embed wp-block-embed-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/gist.github.com\/millerscout\/6f2db01d0e304f997ec3c61efdc9b5c8\n<\/div><figcaption>Sim&#8230; um c\u00f3digo muito grande n\u00e3o \u00e9 mesmo? eu tamb\u00e9m acho que \u00e9 necess\u00e1rio dividir pra conquistar.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Coletando M\u00e9tricas<\/h2>\n\n\n\n<p>Primeiro passo foi separar todo o c\u00f3digo que eu tinha em um ambiente mais controlado, afinal neste mesmo projeto outros itens utilizam o mesmo recurso de Feedback pro usu\u00e1rio e atualizam a GUI sem impacto, logo nosso foco \u00e9 mais espec\u00edfico.<\/p>\n\n\n\n<p>N\u00e3o sei se costumam usar o profiler do VS, se n\u00e3o tem o costume, comecem, ele \u00e9 mais barato que quebrar a cabe\u00e7a, chutar o problema ou esperar que m\u00e1gicamente o problema suma.<\/p>\n\n\n\n<p>Eu tenho uma lista de <a href=\"https:\/\/github.com\/millerscout\/book-of-reference\/blob\/master\/CSharp.md\">Profilers<\/a> que j\u00e1 usei, o do VS \u00e9 <em>okay<\/em>, meu favorito? nProfiler, como a ferramenta \u00e9 cerca de R$ 3000, vou demorar um pouco pra adquirir e apresentar a diferen\u00e7a em um post futuro.<\/p>\n\n\n\n<p>Voltando ao assunto&#8230;<br><br>Coloquei o breakpoint em 5 pontos:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Na primeira linha do main.<\/li><li>Antes de carregar os mods pra mem\u00f3ria.<\/li><li>Antes de carregar as altera\u00e7\u00f5es do jogo base.<\/li><li>Carragando as mudan\u00e7as do Mod.<\/li><li>\u00daltima linha.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Profiler\" width=\"900\" height=\"506\" src=\"https:\/\/www.youtube.com\/embed\/5hQOfHCuqjQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n<\/div><figcaption>Bom perceberam? quando clica nos eventos na parte superior d\u00e1 pra identificar a quantidade de GC, Mem\u00f3ria e CPU est\u00e1 sendo consumido, as setas amarelas s\u00e3o execu\u00e7\u00f5es de limpeza do GC \ud83d\ude09<\/figcaption><\/figure>\n\n\n\n<p>essa \u00e9 uma forma, f\u00e1cil de saber qual dos itens voc\u00ea quer come\u00e7ar a otimiza\u00e7\u00e3o, quer uma mais f\u00e1cil ainda sem breakpoints?<\/p>\n\n\n\n<p>Alt+F2, selecione CPU Usage e rode o projeto.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Cpu usage with VS\" width=\"900\" height=\"506\" src=\"https:\/\/www.youtube.com\/embed\/-VR8VChFGBQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>s\u00f3 faltou o VS programar pra voc\u00ea agora n\u00e9?<\/p>\n\n\n\n<p>Vamos nos focar nesse caso aqui<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/millerdantas.files.wordpress.com\/2021\/03\/image-4.png?w=1024\" alt=\"\" class=\"wp-image-509\"\/><figcaption>faz sentido demorar eim..<\/figcaption><\/figure>\n\n\n\n<p>V\u00e1rias itera\u00e7\u00f5es que podem ser simplificadas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dados coletados, bora pro c\u00f3digo<\/h2>\n\n\n\n<p>Vamos dar um tapa nessa parte, e mensurar os ganhos.<\/p>\n\n\n\n<p>O <a href=\"https:\/\/github.com\/millerscout\/Kenshi-Mod-Manager\/commit\/31a34a9c5b11069ba9c6005334139d866e039904\">Commit<\/a> da altera\u00e7\u00e3o e o resultado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/millerdantas.files.wordpress.com\/2021\/03\/image-5.png?w=1024\" alt=\"\" class=\"wp-image-521\"\/><\/figure>\n\n\n\n<p>de certa forma melhorou, reduzimos um pouco o GC, aumentou o tempo para processamento mas j\u00e1 esper\u00e1vamos, j\u00e1 que n\u00e3o processamos mais paralelamente as altera\u00e7\u00f5es,  Estamos dependendo do IO, d\u00e1 pra fazer mais nada&#8230; ser\u00e1?<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/millerdantas.files.wordpress.com\/2021\/03\/2f1f9-0y8auuhsotgrqx40h.jpeg\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p>O Inimigo agora \u00e9 outro: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/millerdantas.files.wordpress.com\/2021\/03\/image-6.png?w=758\" alt=\"\" class=\"wp-image-523\"\/><\/figure>\n\n\n\n<p>Mais uma itera\u00e7\u00e3o no <a href=\"https:\/\/github.com\/millerscout\/Kenshi-Mod-Manager\/commit\/925dba9c911ea8c0565ecdf4e66d75ba572475a9\">commit<\/a> mudan\u00e7as:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Mudei para acessar o dictionary diretamente e atualizar o objeto<\/li><li>Remo\u00e7\u00e3o do concurrentBag.<\/li><li>Altera\u00e7\u00e3o de classes para structs de ModListChanges e DetailChanges <\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/millerdantas.files.wordpress.com\/2021\/03\/image-7.png?w=1024\" alt=\"\" class=\"wp-image-525\"\/><\/figure>\n\n\n\n<p>Gen 0:499<br>Gen 1:103<br>Gen 3:10<\/p>\n\n\n\n<p>estamos no caminho certo, come\u00e7ando respeitar o GC, executamos mesmo processo e em alguns segundos mais r\u00e1pido, est\u00e1 bom, mas vamos buscar a excel\u00eancia, ou at\u00e9 onde minha capacidade der, mas voc\u00eas podem me mandar msg pra melhorarmos ainda mais \ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Notas:<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Percebeu como eu ignorei o fato que estou usando 3 objetos est\u00e1ticos em uma classe nada haver &#8220;Helpers&#8221;?<br>pois \u00e9, o foco est\u00e1 em resolver o problema depois pensamos em uma forma elegante de organizar o c\u00f3digo.<\/li><li>Tenho quase certeza que estava usando o updateFactory e addFactory errado naquele dictionary :x, nem vou olhar porque deu vergonha <\/li><li>paramos de atualizar um objeto em mem\u00f3ria sem necessidade no DetailChanges.<\/li><li>Simplifiquei a forma que era gerado o Hash.<\/li><\/ul>\n\n\n\n<p>Vou encerrar mais esse post, acredito que temos grandes li\u00e7\u00f5es aprendidas.<br>E lembrem-se para tomar uma a\u00e7\u00e3o precisamos testar, mensurar, mudar e repetir. <\/p>\n\n\n\n<p>Pr\u00f3ximo post.. quando eu tiver tempo :p<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bom, continuando o post anterior: Sobre Otimiza\u00e7\u00e3o em aplica\u00e7\u00f5es .Net &#8211; Parte 1, se voc\u00ea n\u00e3o leu, vai l\u00e1, porque eu estou tentando ser o mais detalhista poss\u00edvel. N\u00f3s paramos no seguinte cen\u00e1rio: eu dei uma lida no c\u00f3digo inteiro e n\u00e3o particularmente n\u00e3o vi nada gritante muito expl\u00edcito, sendo assim, j\u00e1 posso come\u00e7ar fazer &hellip; <a href=\"https:\/\/millerdantas.com\/blog\/2021\/03\/01\/sobre-otimizacao-em-aplicacoes-net-parte-2\/\" class=\"more-link\">Continue lendo <span class=\"screen-reader-text\">Sobre otimiza\u00e7\u00e3o em aplica\u00e7\u00f5es .Net &#8211; Parte 2<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-495","post","type-post","status-publish","format-standard","hentry","category-programacao"],"_links":{"self":[{"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/posts\/495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/comments?post=495"}],"version-history":[{"count":1,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/posts\/495\/revisions"}],"predecessor-version":[{"id":549,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/posts\/495\/revisions\/549"}],"wp:attachment":[{"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/media?parent=495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/categories?post=495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/tags?post=495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}