{"id":541,"date":"2021-03-09T01:19:11","date_gmt":"2021-03-09T04:19:11","guid":{"rendered":"https:\/\/millerdantas.wordpress.com\/?p=541"},"modified":"2021-03-11T22:02:43","modified_gmt":"2021-03-12T01:02:43","slug":"sobre-otimizacao-em-aplicacoes-net-parte-3-final","status":"publish","type":"post","link":"https:\/\/millerdantas.com\/blog\/2021\/03\/09\/sobre-otimizacao-em-aplicacoes-net-parte-3-final\/","title":{"rendered":"Sobre otimiza\u00e7\u00e3o em aplica\u00e7\u00f5es .Net \u2013 Parte 3 (final?)"},"content":{"rendered":"\r\n<p>Continuando essa saga, espero que seja \u00fatil pra voc\u00ea jovem aprendiz que anseia por casos reais de otimiza\u00e7\u00e3o em um c\u00f3digo aberto.<\/p>\r\n\r\n\r\n\r\n<p>Cen\u00e1rio anterior: <\/p>\r\n\r\n\r\n\r\n<p>Memory: 937mb<br>Gen 0:499<br>Gen 1:103<br>Gen 3:10<\/p>\r\n\r\n\r\n\r\n<p>Enquanto estive removendo bugs do meu <a href=\"https:\/\/github.com\/millerscout\/StardewMillerMods\">mod<\/a>, e estudando o Livro do Konrad, Pro .NET Memory Management, se voc\u00ea n\u00e3o conhece, tente assistir a explica\u00e7\u00e3o em uma confer\u00eancia sobre performance.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/images-na.ssl-images-amazon.com\/images\/I\/41fsSrgwQlL._SX348_BO1,204,203,200_.jpg\" alt=\"\" width=\"200\" height=\"285\"\/><figcaption>Cr\u00e9dito: Amazon.<\/figcaption><\/figure><\/div>\r\n\r\n\r\n\r\n<p>Acabei exercitando nesse c\u00f3digo do KMM, e n\u00e3o documentei de maneira pr\u00e1tica as altera\u00e7\u00f5es, mas vou apresent\u00e1-las com a aus\u00eancia do meu pensamento na hora.<\/p>\r\n\r\n\r\n\r\n<p>Utilizando a t\u00e9cnica que apresentei na <a href=\"https:\/\/millerdantas.wordpress.com\/2021\/03\/01\/sobre-otimizacao-em-aplicacoes-net-parte-2\/\">parte 2<\/a> fui iterando nos itens que foram apresentando maior impacto no GC e mem\u00f3ria.<br>lista de altera\u00e7\u00f5es:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\"><li>Remo\u00e7\u00e3o de uma lista de tags que n\u00e3o fazia mais sentido pro c\u00f3digo.<\/li><li>Altera\u00e7\u00e3o de alguns setters para private afim de identificar quais classes eram pass\u00edveis de ser transformadas em structs.<\/li><li>Simplifica\u00e7\u00e3o de algumas strings que estavam sendo concatenadas em apenas uma string (Agora estou lembrando do Crocco), mas j\u00e1 j\u00e1 eu uso a Span<T><\/li><li>dupliquei a parte que carrega algumas altera\u00e7\u00f5es dos mods, por\u00e9m removi os pontos que n\u00e3o eram pertinentes para identificar os conflitos.<\/li><li>transformei mais algumas classes em Structs e adequei o c\u00f3digo para inicializar os valores direto na struct.<\/li><li>simplifica\u00e7\u00e3o para setar o valor de TripleInt<\/li><li>remo\u00e7\u00e3o de uma lista sem capacity que n\u00e3o estava sendo usada para nada, mas mesmo assim era populada.<\/li><li>altera\u00e7\u00e3o para setar o valor do filename em uma propriedade inv\u00e9s de sempre ficar chamando Path.GetFileName((&#8230;));<\/li><\/ul>\r\n\r\n\r\n\r\n<p>Bora pra parte de praxe o <a href=\"https:\/\/github.com\/millerscout\/Kenshi-Mod-Manager\/commit\/3794379113e0d1bdcb637b835c65543b94645af6\">commit<\/a> e o resultado: <\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/millerdantas.files.wordpress.com\/2021\/03\/image-8.png?w=515\" alt=\"\" class=\"wp-image-546\" width=\"815\" height=\"184\"\/><\/figure><\/div>\r\n\r\n\r\n\r\n<p>O que achou?<\/p>\r\n\r\n\r\n\r\n<p>n\u00e3o sei voc\u00ea, mas eu estou aqui:<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/media0.giphy.com\/media\/QBC5foQmcOkdq\/giphy.gif?cid=ecf05e47zirju22xy9y22sj9jq1p48i8cwa7sadfekbqnqp5&#038;rid=giphy.gif\" alt=\"Clap Applause GIF\"\/><\/figure><\/div>\r\n\r\n\r\n\r\n<p>sumarizando os resultados:<\/p>\r\n\r\n\r\n\r\n<p>Gen 0: 187 redu\u00e7\u00e3o de 84% comparando com 1217 do primeiro post<br>\r\nGen 1: 72 redu\u00e7\u00e3o de 79% comparando com 351 do primeiro post<br>\r\n\tGen 3: 11 redu\u00e7\u00e3o de 54% comparando com 24 do primeiro post<br>\r\n\tTempo: 13179ms redu\u00e7\u00e3o de 83% comparando com 77309ms do primeiro post.<br>\r\n\tMem\u00f3ria: 590mb redu\u00e7\u00e3o de 37% comparando com 944 do primeiro post.\r\n<\/p>\r\n\r\n\r\n\r\n<p>Apesar desses resultados muito bons&#8230;<\/p>\r\n\r\n\r\n\r\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>\r\n\r\n\r\n\r\n<p>N\u00e3o me leve a mal, n\u00e3o \u00e9 que acho o resultado insatisfat\u00f3rio, mas o problema aqui n\u00e3o \u00e9 mais efici\u00eancia de c\u00f3digo, apesar de ter espa\u00e7o pra otimiza\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p>Consideremos a frase de Lowell Arthur descrito em &#8220;Software Engineering: A Practitioner&#8217;s Approach&#8221; by Roger Pressman: <br>&#8220;<em>20 percent of the code has 80 percent of the errors. Find them; fix them!<\/em>&#8220;<\/p>\r\n\r\n\r\n\r\n<p>O que quero dizer \u00e9 que os 20% do c\u00f3digo, at\u00e9 mais que isso foi otimizado, por\u00e9m eu preciso resolver o armazenamento de informa\u00e7\u00e3o e indexa\u00e7\u00e3o ineficiente <em>BY DESIGN<\/em><\/p>\r\n\r\n\r\n\r\n<p>vamos compreender o cen\u00e1rio: <\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\"><li>S\u00e3o mais de 300 mods <\/li><li>cada mod pode conter milhares de altera\u00e7\u00f5es.<\/li><li>usamos os arquivos base do jogo para identificar quais altera\u00e7\u00f5es foram feitas.<\/li><li>carregamos todos os mods, indexamos os conflitos e enviamos pra mem\u00f3ria<\/li><\/ul>\r\n\r\n\r\n\r\n<p>Somente com esses pontos \u00e9 expl\u00edcito o pr\u00f3ximo passo, precisamos indexar essas altera\u00e7\u00f5es quando n\u00e3o existirem em uma base de dados, caso exista e o arquivo foi alterado indexamos, do contr\u00e1rio apenas usamos o que est\u00e1 dispon\u00edvel desta forma utilizaremos o consumo de CPU de forma eficiente, j\u00e1 que uma vez que ele trabalhar pra processar os <em>mods<\/em>, o trabalho ser\u00e1 recuper\u00e1vel.<br><br>Tamb\u00e9m ganharemos mais mem\u00f3ria, j\u00e1 que poderemos ent\u00e3o carregar os conflitos somente para o <em>mod <\/em>que for selecionado na tela.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos passos<\/h2>\r\n\r\n\r\n\r\n<p>Meu processo de otimiza\u00e7\u00e3o neste cen\u00e1rio se mostra suficiente para o problema abordado,<\/p>\r\n\r\n\r\n\r\n<p>continuarei trabalhando na otimiza\u00e7\u00e3o e indexa\u00e7\u00e3o desses arquivos de forma eficiente.<\/p>\r\n\r\n<p>\r\n\tacabei corrigindo o valores de ganho, porque eu acabei invertendo as imagens&#8230;. :facepalm:\r\n<\/p>\r\n\r\n<p>continuarei documentando as decis\u00f5es que fui tomando, tentarei trazer o <em>brainstorm <\/em>que posso ter tido.<br><br>Esteja curioso!<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Continuando essa saga, espero que seja \u00fatil pra voc\u00ea jovem aprendiz que anseia por casos reais de otimiza\u00e7\u00e3o em um c\u00f3digo aberto. Cen\u00e1rio anterior: Memory: 937mbGen 0:499Gen 1:103Gen 3:10 Enquanto estive removendo bugs do meu mod, e estudando o Livro do Konrad, Pro .NET Memory Management, se voc\u00ea n\u00e3o conhece, tente assistir a explica\u00e7\u00e3o em &hellip; <a href=\"https:\/\/millerdantas.com\/blog\/2021\/03\/09\/sobre-otimizacao-em-aplicacoes-net-parte-3-final\/\" class=\"more-link\">Continue lendo <span class=\"screen-reader-text\">Sobre otimiza\u00e7\u00e3o em aplica\u00e7\u00f5es .Net \u2013 Parte 3 (final?)<\/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-541","post","type-post","status-publish","format-standard","hentry","category-programacao"],"_links":{"self":[{"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/posts\/541","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=541"}],"version-history":[{"count":3,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/posts\/541\/revisions"}],"predecessor-version":[{"id":574,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/posts\/541\/revisions\/574"}],"wp:attachment":[{"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/media?parent=541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/categories?post=541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/millerdantas.com\/blog\/wp-json\/wp\/v2\/tags?post=541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}