<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>MouseOver Studio &#187; otimização</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/otimizacao/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mouseoverstudio.com/blog</link>
	<description></description>
	<pubDate>Wed, 25 Aug 2010 02:03:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Profiling em Java com JProfiler</title>
		<link>http://www.mouseoverstudio.com/blog/2008/02/17/profiling-em-java-com-jprofiler/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/02/17/profiling-em-java-com-jprofiler/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 18:09:12 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Tutoriales]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[otimização]]></category>

		<category><![CDATA[performance]]></category>

		<category><![CDATA[analises]]></category>

		<category><![CDATA[jprofiler]]></category>

		<category><![CDATA[profiler]]></category>

		<category><![CDATA[profiling]]></category>

		<category><![CDATA[tunning]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=67</guid>
		<description><![CDATA[Um profiler é uma ferramenta que informa sobre o comportamento de uma aplicação em tempo de execução. 
Depois de pesquisar sobre diversos profilers para analisar uma aplicação Java, cheguei na conclusão que o JProfiler é o melhor. O único problema do JProfiler ate agora é que ele é pago. 
Vamos instalar uma versão trial dele [...]]]></description>
			<content:encoded><![CDATA[<p>Um profiler é uma ferramenta que informa sobre o comportamento de uma aplicação em tempo de execução. </p>
<p>Depois de pesquisar sobre diversos profilers para analisar uma aplicação Java, cheguei na conclusão que o <a href="http://www.ej-technologies.com/index.html">JProfiler</a> é o melhor. O único problema do JProfiler ate agora é que ele é pago. </p>
<p>Vamos instalar uma versão trial dele e ver o que podemos fazer com ele. Para descarregar o trial do JProfiler primeiro temos que acesar essa <a href="http://www.ej-technologies.com/download/jprofiler/trial.php">pagina</a> e preencher o formulário. Um key para poder testar a ferramenta por dez dias será enviado. Seguidamente podemos entrar na <a href="http://www.ej-technologies.com/download/jprofiler/files_trial.php">área de downloads</a> e baixar a versão desejada. A versão que eu estarei baixando é a 5.1.2, versão instalação executável. </p>
<p>A descarga finalizou e também chegou meu key, agora vou instalar. Vou ir no console na pasta onde descarreguei o arquivo e dar um <em>./jprofiler_linux_5_1_2.sh</em>. Seguidamente é aberto um wizard onde aceitamos os termos do programa e indicamos onde queremos instala-lo. </p>
<p>Ao abrir o programa pela primeira vez é apresentado outro wizard, dessa vez uma wizard de configuração. Nesse wizard devemos inserir nossa key, escolher a VM que desejamos utilizar, indicar se queremos integrar o JProfiler com algum IDE e escolher nosso browser, é um processo bem simples. </p>
<p>Uma vez terminado o segundo wizard aparece um terceiro onde podemos indicar qual aplicação queremos que o profiler analise. Podemos também configurar para fazer que esse wizard apareça toda vez que abrirmos o programa ou não. Eu escolhi para aparecer toda vez porque é um wizard muito simples e faz que em um tempo muito pequeno tenhamos um profiler trabalhando com nossa aplicação escolhida.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler1.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler1_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Nessa oportunidade, vou utilizar o profiler com uma aplicação web minha que estou fazendo. A aplicação e muitos simples e possivelmente não vamos poder descobrir picos de garrafa, mas vamos poder obter uma idéia do que podemos fazer com o JProfiler. Justamente pelo que vou analizar uma aplicação web vou escolher no wizard a opção <em>An application server, locally or remotely</em>. Vou dar <em>next</em> e seguidamente vou escolher a versão do servidor de aplicação que vou utilizar, JBoss 4.x no meu caso. <em>Next</em> novamente, escolho que o servidor de aplicação esta nessa máquina e dou next novamente. Agora vou indicar qual é o arquivo que levanta o servidor. No meu caso ele se encontra na pasta <em><jboss -home>/bin/</jboss></em> e se chama <em>run.sh</em>. Passos seguintes são escolher a máquina virtual a utilizar, a porta desejada para a conexão do profiler e decidir se queremos que nosso servidor de aplicação espere por uma conexão do profiler antes de inicializar ou não. Vou escolher a opção <em>Wait for connection from the JProfiler GUI</em> que quer dizer que quero que espere e avançar para o próximo passo. No seguinte passo é visualizado um resumo do que foi configurado e no ultimo temos a opção de escolher se queremos inicializar o servidor agora ou deixar isso para mais tarde. Vou escolher que quero inicializar agora escolhendo a opção <em>Yes, start the application server for profiling</em>. </p>
<p>Uma vez finalizado o wizard apareceu para mim uma janela indicando que minha versão e de evaluação. Tenho a opção de inserir uma key pagar. Vou fazer click em <em>Evaluate</em> para evaluar somente porque não comprei nada.</p>
<p>Antes de iniciar o servidor aparece uma janelha onde podemos fazer umas ultimas configurações. Também é indicado o nivel de CPU e memória que o JProfiler precisara de acordo com o configurado. Eu quero que tudo seja gravado então vou escolher as opções <em>Record CPU data on startup</em> e <em>Record allocations on startup</em> que vão a analizar quando cpu e quanta memória o servidor utiliza para inicializar.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler2.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler2_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Vou mudar a configuração do meus filtros porque não quero que todas as classes sejam analisadas, somente as classes do pacote com.mouseoverstudio . Na seção <em>Filter settings</em> vou fazer click em <em>Edit</em>. Por default, nos filtros ja vem configura um filtro para excluir do analise um monte de classes. Vou deixar as coisas mas simples apagando esse filtro e incluindo um novo do tipo inclusivo com o valor com.mouseoverstudio . </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler3.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler3_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Seguidamente <em>ok</em> na janela e <em>ok</em> novamente na outra janela.</p>
<p>É aberto uma console com o debug do JBoss onde podemos ver que ele esta inicializando.</p>
<p>Durante a inicialização podemos ir no JProfiler na opção <em>VM Telemetry Views</em> e ver a memoria ram que esta sendo consumida em tempo real e ao longo de tempo de vida do nosso servidor:</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler4.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler4_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Na parte inferior aparecem umas abas. Se fizermos click na aba <em>Recorded Objects</em> podemos visualizar a quantidade de objetos que residem na memória. Nas outras abas podemos analisar a quantidade de objetos criados e liberados da memória (Recorded Throughtput), a atividade do Garbage Collector (GC Activity), a quantidade de classes sendo analisadas pelo profiler (Classes), os Threads (Threads) e a carga do cpu (CPU Load).</p>
<p>Vou navegar um pouco na minha aplicação, vou selecionar uma funcionalidade pesada e durante sua execução vou me dirigir no JProfiler. Na opção <em>Memory Views</em> podemos ver o numero de instâncias existentes na memória, agrupadas por classes, pacotes ou componentes e quanta memória esse número de instâncias estão utilizando. Num primeiro momento é mostrada informação sobre todas as classes do sistema. </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler5.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler5_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Como eu quero ver somente informação sobre minhas classes, vou me dirigir para <em>View Filters</em> e digitar <em>com.mouseoverstudio</em> . Ao dar <em>enter</em> são filtradas as classes que não pertencem ao pacote <em>com.mouseoverstudio</em> .</p>
<p>Essa funcionalidade é muito legal. Nessa semana estava analisando a aplicação de um cliente quando vi que ao acessar uma funcionalidade x, eram criadas muitas instâncias de um objeto o qual não deveria ter mais de uma por usuário. Depois de analisar o código com os desenvolvedores a gente percebeu que estava sendo criada a instância de um classe dentro de um loop, quando deveria ser fora de acordo com a lógica do negocio. </p>
<p>Eu sabia que estavam sendo criadas muitas instâncias de um classe, mas como saber onde eram criadas estas instâncias? Na seção <em>CPU Views</em> podemos visualizar uma árvore de chamadas sendo realizadas na VM. Dentro da informação se encontra o peso de aquela chamada em relação as outras, o tempo que demorou e o numero de invocações que teve. Podemos agrupar as chamadas novamente por métodos, classes, pacotes ou componentes, filtras informação de certo pacote ou de certa thread.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler6.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler6_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Na aba <em>Hot Spots</em> temos informação parecida, mas partindo de outras fontes, chamadas Hot Spots. Eu estou na dúvida sobre se sei corretamente o que é um Hot Spot e o que representa mas sei que a informação apresentada parte deles. </p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler7.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler7_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Se fizermos click direito numa classe dentro da árvore e selecionarmos <em>Show Call Graph</em> vamos poder visualizar a informação desejada mas de um modo gráfico, podendo escolher um layout hierárquico, ortogonal ou orgânico.  Nesse gráfico é apresentada a mesma informação e podemos ir navegando por ele e abrindo conexões, podendo apreciar como as classes estão se relacionando entre sim.</p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler8.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler8_t.jpg" alt="" /></a><br /></center></p>
<p><center><a href="http://www.mouseoverstudio.com/blog/images/jprofiler9.jpg" rel="lightbox" class="imagelink"><img src="http://www.mouseoverstudio.com/blog/images/jprofiler9_t.jpg" alt="" /></a></p>
<p></center></p>
<p>Foi assim que no caso do cliente eu escolhi uma classe de partida que eu sabia que a requisição tinha passado por ali e fui navegando ate achar a classe que criava aquela quantidade enorme de instâncias. </p>
<p>JProfiler tem muita outra informação a oferecer, mas como eu sou ainda novato com a ferramenta, não entendo toda ela corretamente e poderia confundir as pessoas se tratasse de explica-las. Porém, com o que eu tenho aprendido e tentado explicar nesse post ja da para fazer muito análise de uma aplicação e tirar uso da ferramenta. Justamente com aquele uso e que se vão aprendendo novas coisas e conforme eu for aprendendo vou ir postando aqui.</p>
<p>Qualquer informação a mais por favor deixar-las nos comentários.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/02/17/profiling-em-java-com-jprofiler/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hack no IE para selecionar elementos de uma combo em menor tempo</title>
		<link>http://www.mouseoverstudio.com/blog/2008/01/08/hack-no-ie-para-selecionar-elementos-de-uma-combo-em-menor-tempo/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/01/08/hack-no-ie-para-selecionar-elementos-de-uma-combo-em-menor-tempo/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 19:45:58 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[ie]]></category>

		<category><![CDATA[otimização]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=45</guid>
		<description><![CDATA[Numa aplicação web na qual estava mexendo junto a outros desenvolvedores existia uma funcionalidade que consistia em gerar uns relatórios a partir de uns funcionários selecionados. A lista de funcionários se encontrava num combo box de múltipla escolha, com uma opção na parte inferior para selecionar todos os elementos da mesma. Dependendo do cliente onde [...]]]></description>
			<content:encoded><![CDATA[<p>Numa aplicação web na qual estava mexendo junto a outros desenvolvedores existia uma funcionalidade que consistia em gerar uns relatórios a partir de uns funcionários selecionados. A lista de funcionários se encontrava num combo box de múltipla escolha, com uma opção na parte inferior para selecionar todos os elementos da mesma. Dependendo do cliente onde a aplicação esta rodando, a lista de funcionários pode ser bem grande (1000+) e a operação de selecionar todos pode demorar uns segundos se o browser for tão bom quanto o Internet Explorer <img src='http://www.mouseoverstudio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A operação de selecionar todos consistia em fazer um loop das options do select e marcar cada uma como &#8220;selected = true&#8221;. Tentando optimizar o processo um dos desenvolvedores lembro das épocas em que mexia com VB e sugeriu ocultar o select, fazer o loop e depois mostrar o select de novo. O resultado foi impressionante, o processo foi umas 20x mais rápido!</p>
<p>Segue o script e uma prova do mencionado. A função selectAll1() implementa o procedimento utilizado em primeira instância. Já a função selectAll2() implementa também o hack de ocultar a combo antes de fazer a operação. Nas duas funções e logado o tempo que demorou a operação.</p>
<pre class="prettyprint">
function selectAll1() {
	var date = new Date();
	var options = document.getElementById("select").options;
	var optionsLength = options.length;
	for (var i = 0; i < optionsLength; i++) {
		options[i].selected = true;
	}
	log(1, new Date() - date);
}

function selectAll2() {
	var date = new Date();
	var select = document.getElementById("select");
	select.style.display = "none";
	var options = select.options;
	var optionsLength = options.length;
	for (var i = 0; i < optionsLength; i++) {
		options[i].selected = true;
	}
	select.style.display = "";
	log(2, new Date() - date);
}

function log(i, ms) {
	document.getElementById("console").innerHTML += "selectAll" + i +
			" : " + ms + "ms&#8220;;
}
</pre>
<p><iframe src="./testes/selectAll.html" style="width:100%; height: 300px;border: 1px solid #888888"></iframe></p>
<p>No IE a função selectAll1 demorou em média 700ms, a diferença da função selectAll2 que foi executada em somente 30 segundos na média. No Firefox os resultados das duas funções não foram tão distantes. Demoraram em média 150ms e 140ms respectivamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/01/08/hack-no-ie-para-selecionar-elementos-de-uma-combo-em-menor-tempo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Melhorando a performance do Eclipse em 123</title>
		<link>http://www.mouseoverstudio.com/blog/2008/01/06/melhorando-a-performance-do-eclipse-em-123/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/01/06/melhorando-a-performance-do-eclipse-em-123/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 23:37:29 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[eclipse]]></category>

		<category><![CDATA[otimização]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=44</guid>
		<description><![CDATA[Estava tendo alguns problemas de performance (permSpace) com o Eclipse e decidi procurar sobre assunto. Foi assim que cheguei nesse artigo de Riyad Kalla na EclipseZone chamado Tuning Eclipse Performance and Avoiding OutOfMemoryExceptions.
O artigo ja tem dois anos de vida mas mesmo assim foi de muita utilidade. Basicamente o que Riyad recomenda e inicializar o [...]]]></description>
			<content:encoded><![CDATA[<p>Estava tendo alguns problemas de performance (permSpace) com o Eclipse e decidi procurar sobre assunto. Foi assim que cheguei nesse artigo de <a href="http://www.eclipsezone.com/forums/profile.jspa?userID=40277">Riyad Kalla</a> na <a href="http://www.eclipsezone.com">EclipseZone</a> chamado <a href="http://www.eclipsezone.com/eclipse/forums/t61618.html">Tuning Eclipse Performance and Avoiding OutOfMemoryExceptions</a>.</p>
<p>O artigo ja tem dois anos de vida mas mesmo assim foi de muita utilidade. Basicamente o que Riyad recomenda e inicializar o Eclipse com os seguintes argumentos numa máquina com 1GB de memória RAM: </p>
<p>-vmargs -Xms512m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=128m </p>
<p>No caso de possuir outra quantidade de memória RAM, basta com proporcionar os valores diretamente. Por exemplo, se tivermos uma máquina com 512 MB de RAM, os argumentos ficariam assi:</p>
<p>-vmargs -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=64m</p>
<p>Os argumentos são especificados no arquivo eclipse.ini dentro da pasta principal do Eclipse. Nesse casso, os argumentos especificados servem para indicar a VM quanta memória ela pode usar para alocar classes e outros recursos. Ao possuir mas espaço disponível, a performance melhora. Somente não podemos dar a oportunidade dela poder pegar muita memória porque ali outras aplicações poderiam se ver afetadas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/01/06/melhorando-a-performance-do-eclipse-em-123/feed/</wfw:commentRss>
		</item>
		<item>
		<title>O que fazer quando innerHTML não é suficientemente rápido?</title>
		<link>http://www.mouseoverstudio.com/blog/2007/09/17/o-que-fazer-quando-innerhtml-nao-e-suficientemente-rapido/</link>
		<comments>http://www.mouseoverstudio.com/blog/2007/09/17/o-que-fazer-quando-innerhtml-nao-e-suficientemente-rapido/#comments</comments>
		<pubDate>Tue, 18 Sep 2007 00:50:58 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[otimização]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=25</guid>
		<description><![CDATA[Durante o desenvolvimento de RegexPal, Steven Levithan notou que ao utilizar a propriedade innerHTML de um elemento se perde muito tempo limpando os elementos filhos em comparação a criação dos novos.
Conhecendo isso podemos combinar a velocidade de destruir elementos tirando o elemento pai ao utilizar os métodos do DOM com criar novos elementos utilizando innerHTML.
Foi [...]]]></description>
			<content:encoded><![CDATA[<p>Durante o desenvolvimento de <a href="http://regexpal.com/">RegexPal</a>, Steven Levithan notou que ao utilizar a propriedade innerHTML de um elemento se perde muito tempo limpando os elementos filhos em comparação a criação dos novos.</p>
<blockquote><p>Conhecendo isso podemos combinar a velocidade de destruir elementos tirando o elemento pai ao utilizar os métodos do DOM com criar novos elementos utilizando innerHTML.</p></blockquote>
<p>Foi assim que uma solução foi sugerida e devido a participação dos leitores nos comentários foi melhorada notavelmente. <a href="http://blog.netxus.es/">DrSlump</a> percebeu que mesmo a função sendo bem mais rápida que o innerHTML no Firefox, no IE era mais lenta e recomendou uma <a href="http://www.mouseoverstudio.com/blog/?p=24">compilação condicional</a>. Por sua parte, <a href="http://dean.edwards.name/">Dean Edwards</a> sugeriu a utilização do método cloneNode para poder transferir todos os atributos de um elemento pra outro. Ao final a função ficou assim:</p>
<pre class="prettyprint">
function replaceHtml(element, html) {
	var oldElement =
			(typeof element === "string" ? document.getElementById(element): element);
	/*@cc_on // innerHTML puro e mais rápido em IE
		oldElement.innerHTML = html;
		return oldElement;
	@*/
	var newElement = oldElement.cloneNode(false);
	newElement.innerHTML = html;
	oldElement.parentNode.replaceChild(newElement, oldElement);
	/* Como acabamos de remover o elemento antigo do DOM, retornar uma referenca
	ao novo elemento, o qual pode ser utilizado para restaurar referencias da variable */
	return newElement;
};
</pre>
<p>Para testar os resultados podem acessar a <a href="http://stevenlevithan.com/demo/replaceHtml.html">página</a> criada pelo mesmo Steven.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2007/09/17/o-que-fazer-quando-innerhtml-nao-e-suficientemente-rapido/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
