
<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Desenvolvendo Software &#187; Desempenho</title>
	<atom:link href="http://www.desenvolvendosoftware.com.br/category/software/desempenho/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.desenvolvendosoftware.com.br</link>
	<description>Tudo o que um desenvolvedor quer e precisa saber</description>
	<lastBuildDate>Tue, 29 Dec 2009 22:11:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Otimização de Software: Quando? Onde? Porquê?</title>
		<link>http://www.desenvolvendosoftware.com.br/2009/08/otimizacao-de-software-quando-onde-porque/</link>
		<comments>http://www.desenvolvendosoftware.com.br/2009/08/otimizacao-de-software-quando-onde-porque/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 11:47:33 +0000</pubDate>
		<dc:creator>Leila</dc:creator>
				<category><![CDATA[Desempenho]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Resolução Problemas]]></category>

		<guid isPermaLink="false">http://www.desenvolvendosoftware.com.br/?p=237</guid>
		<description><![CDATA[A otimização de software é um dos tópicos mais mal-entendidos pelos profissionais de TI. Muitos pensam que a performace só deve ser levada em consideração ao final do desenvolvimento, devido a uma máxima conhecida por muitos &#34;premature optimization is the root of all evil&#34;, em tradução livre &#34;otimização prematura é a raiz de todos os [...]]]></description>
			<content:encoded><![CDATA[<p>A otimização de software é um dos tópicos mais mal-entendidos pelos profissionais de TI. Muitos pensam que a performace só deve ser levada em consideração ao final do desenvolvimento, devido a uma máxima conhecida por muitos &quot;premature optimization is the root of all evil&quot;, em tradução livre &quot;otimização prematura é a raiz de todos os males&quot;. Este dizer é mal-interpretado por muitos como: todas as considerações de performace devem ser feitas apenas ao final do desenvolvimento. É mesmo? Problemas de performance podem e devem ser previstos durante a fase de projeto, como tudo em software, <strong>quando mais cedo o problema é encontrado, mais barato é a solução.</strong> </p>
<h2>O mal entendido</h2>
<p>O dizer “otimização prematura é a raiz de todos os males” de Donald Knuth está incompleto. A forma completa é “We should forget about small efficiencies, say about 97% of the time, premature optimization is the root of all evil.”, em tradução livre “Devemos esquecer as pequenas eficiências, digamos 97% do tempo, otimização prematura é a raiz de todos os males.” Donald Knuth estava falando da micro-otimização do código, não fornecendo um passe livre para métodos ineficientes. </p>
<p>Outro ponto a ser considerado, é a época na qual Donald Knuth fez a sua declaração. Naqueles idos tempos, otimização normalmente consistia em ficar contando ciclos de CPU gastos em cada instrução. Com certeza, esse tipo de preocupação não é adequada no momento do projeto do sistema. Ele não estava falando da escolha do algoritmo, estruturas de dados, uso adequado de loops, etc.. </p>
<p><span id="more-237"></span></p>
<h2>O que deve ser feito?</h2>
<p>O código fonte de um programa deve ser claro e de fácil manutenção. Pequenas ineficiências são perfeitamente aceitáveis. Em uma série de excelentes artigos de Thomas Aylesworth, Software Efficiency and Optimization Partes <a href="http://swampthingtom.blogspot.com/2007/03/software-efficiency-and-optimization.html">1</a>, <a href="http://swampthingtom.blogspot.com/2007/03/software-efficiency-and-optimization_25.html">2</a> e <a href="http://swampthingtom.blogspot.com/search/label/Software%20Development">3</a>, comenta sobre o caso do laço <em>foreach</em>, mais ineficiente porém mais claro que o laço <em>for</em>. A diferença é pequena o suficiente para não ter importância na maior parte do tempo no desenvolvimento de jogos e os cálculos realizados em jogos precisam ser rápidos o suficiente para que ele flua bem. </p>
<p>Um dos itens mais importantes para a velocidade de um programa é o algoritmo utilizado. Quando se faz a escolha de um determinado algoritmo deve-se poder estimar o seu comportamento, principalmente se o número de dados é alto. Esse comportamento normalmente&#160; é definido usando a notação <em>Big O</em>, a qual é usada para comparar algoritmos.</p>
<table border="1" cellspacing="0" cellpadding="2" width="90%">
<tbody>
<tr>
<td valign="top" width="25%">Eficiência</td>
<td valign="top" width="25%">Propriedade Matemática</td>
<td valign="top" width="50%">Comentário</td>
</tr>
<tr>
<td valign="top" width="25%">O(1)</td>
<td valign="top" width="25%">Constante</td>
<td valign="top" width="50%">Independe do tamanho da entrada. Eficiência ideal. Ex: pesquisa em uma tabela hash bem feita</td>
</tr>
<tr>
<td valign="top" width="25%">O(log n)</td>
<td valign="top" width="25%">Logarítmica</td>
<td valign="top" width="50%">Cresce algoritmicamente com o tamanho da entrada. Excelente eficiência, pois o logaritmo cresce lentamente. Ex: pesquisa em uma árvore binária balanceada</td>
</tr>
<tr>
<td valign="top" width="25%">O(n)</td>
<td valign="top" width="25%">Linear</td>
<td valign="top" width="50%">Cresce linearmente com o tamanho da entrada. Boa eficiência. Ex: pesquisa em uma lista encadeada</td>
</tr>
<tr>
<td valign="top" width="133">O(nlogn)</td>
<td valign="top" width="133">Não Linear</td>
<td valign="top" width="133">Desempenho semelhante ao linear, pois o logaritmo cresce lentamente. Desempenho aceitável para muitos dados. Ex: ordenação usando o método quicksort</td>
</tr>
<tr>
<td valign="top" width="25%">O(n²)</td>
<td valign="top" width="25%">Quadrática</td>
<td valign="top" width="50%">Cresce quadradicamente com o tamanho da entrada. Problemas ocorrem com um volume grande de dados. Ex: ordenação usando o método bolha</td>
</tr>
</tbody>
</table>
<p>&#160;</p>
<p>Um algoritimo O(n²) pode ser mais rápido para um número pequenos de dados que um algoritmo O(nlogn), mas com certeza à medida que este número aumenta, o tempo de execução do algoritmo menos eficiente tenderá a ser maior. Isso não quer dizer que o algoritmo mais eficiente deva sempre ser escolhido, muitas vezes um mais simples pode ser o mais adequado. Como escolher? A experiência ajuda, se houver dúvidas pode-se sempre testar com um prototipo.</p>
<p>Outro fato importante é saber as boas práticas da plataforma que você usa. Em Java, por exemplo, você não deve concatenar strings dentro de um loop usando a classe <em>String</em>, deve-se usar a classe <em>StringBuffer.</em> Sobre SQL, encontrei dois posts excelentes: um sobre <a href="http://sqlblog.com/blogs/kevin_kline/archive/2009/07/10/why-do-i-keep-seeing-this-mistake.aspx">loops</a> e outro sobre <a href="http://www.simple-talk.com/community/blogs/philfactor/archive/2009/08/03/74227.aspx">Ad-hoc queries</a>. O post sobre loops traz uma observação simples, aplicável um muitas situações: coloque dentro de loops apenas o que for necessário.</p>
<p><strong>O que eu já vi por aí?</strong> Loops esperando um evento ocorrer sem um sleep (CPU vai a 100%); mensagens de log para debug, dentro de um loop, no código de produção causando lentidão (não havia como desabilitar); criar uma conecção SQL nova para cada usuário logado no sistema de controle de horas e só fechar quando houver <em>logout</em> ou a seção expirar (a empresa tinha direito a 3 conexões e mais de 100 usuários no sistema, na hora da saída, era uma beleza) . Eu já tive problema com o envio de um número excessivo de objetos para um Applet.</p>
<p>É impossível prever tudo. Fez o melhor dentro do seu conhecimento e o desempenho ainda é insatisfatório? Procure a causa e trate, provavelmente será em uma porção pequena do sistema.</p>
<p><strong>Resumindo:</strong> &#8220;otimização prematura é a raiz de todos os males&#8221; não deve ser usada para justificar desperdício de recursos do usuário, nem para codificação descuidada. Deixe a micro-otimização apenas para quando for necessário, mas pense sim, ainda no projeto, no desempenho do sistema. Muitos softwares atuais são pesados, lentos, além do necessário. Bom desempenho e leveza vende bem. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.desenvolvendosoftware.com.br/2009/08/otimizacao-de-software-quando-onde-porque/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

