<?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>Klaus Paiva &#187; Performance</title>
	<atom:link href="http://blog.klaus.pro.br/tags/performance/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.klaus.pro.br</link>
	<description>Idéias e desventuras de Klaus Paiva</description>
	<lastBuildDate>Mon, 12 Jul 2010 20:26:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Web Workers &#8211; Threads em Javascript</title>
		<link>http://blog.klaus.pro.br/2009/ler/web-workers-threads-em-javascript/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/web-workers-threads-em-javascript/index.html#comments</comments>
		<pubDate>Wed, 22 Jul 2009 22:10:48 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Web Workers]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=322</guid>
		<description><![CDATA[No final do mês passado eu coloquei aqui no blog uma nota sobre o lançamento do Firefox 3.5 e as novidades trazidas por essa versão. Fiz uma leitura mais aprofundada nos textos e vi um recurso bastante interessante chamado Web Workers. Segundo a descrição do MDC, os Web Workers permitem a execução de códigos de [...]]]></description>
			<content:encoded><![CDATA[<p>No final do mês passado eu coloquei aqui no blog uma <a href="http://blog.klaus.pro.br/2009/ler/firefox-35/index.html">nota sobre o lançamento do Firefox 3.5</a> e as novidades trazidas por essa versão.</p>
<p>Fiz uma leitura mais aprofundada nos textos e vi um recurso bastante interessante chamado <a href="https://developer.mozilla.org/En/Using_web_workers">Web Workers</a>. Segundo a descrição do <a href="https://developer.mozilla.org/">MDC</a>, os Web Workers permitem a execução de códigos de forma <em>multi-thread</em> dentro de aplicações <em>web</em> e sites.</p>
<p>Quem escreve código Javascript hoje em dia sabe que não é raro o navegador &#8220;congelar&#8221; durante um código que exige um pouco mais de processamento. Existem algumas formas de evitar esse &#8220;congelamento&#8221; sim&#8230; mas certamente os Web Workers elevam a resolução deste problema a outro nível de soluções e possibilidades. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Com os Web Workers você pode iniciar um código que será executado em paralelo ao código Javascript da sua página. Esse código executado pelo &#8220;worker&#8221; trabalha num ambiente diferente, sem acesso à página pai e, principalmente, sem acesso ao DOM. A única forma de comunicação entre a página pai e um processo &#8220;worker&#8221; se dá através de mensagens.</p>
<p>Como eu estava interessado em verificar se esses Web Workers realmente trabalham em paralelo <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , fiz uma página que faz esse teste. Nela, há duas versões de um mesmo código que calcula a <a href="http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Fibonacci">sequência (ou número) de Fibonacci</a>. Além disso, na página há uma <a href="http://docs.jquery.com/Effects">animação com jQuery</a> rodando, o que vai permitir perceber claramente se o navegador vai ou não &#8220;congelar&#8221;.</p>
<p><strong><a href="http://www.klaus.pro.br/projects/web-workers/fibonacci.html">Veja aqui o teste com Web Workers</a></strong>. (para o Firefox só funciona na versão 3.5)</p>
<p>Como você pode ver pelo teste acima, realmente o código roda em <em>background</em>, sem afetar a página renderizada.</p>
<p>Vale ressaltar que nos testes eu exibo também o tempo em milissegundos que a operação levou. Fazendo os testes aqui no meu computador, a versão com Web Workers leva em média 1600 ms, enquanto a versão &#8220;normal&#8221; leva em média 800 ms. O dobro de tempo mas é algo a se ponderar se lembrarmos que a versão &#8220;normal&#8221; trava totalmente o navegador enquanto o cálculo é feito. (<del>interessante&#8230; rodando o teste local, a versão com &#8220;worker&#8221; executa bem mais rápido do que a versão online aqui no blog, talvez pelo tempo de download do &#8220;worker.js&#8221;?</del>)</p>
<p><strong>Update</strong>: na versão do código de testes que eu fiz ontem, ao clicar no botão para calcular o número de Fibonacci, o código do &#8220;worker.js&#8221; era baixado antes do cálculo em si ser executado. Isso causava uma grande diferença entre o teste rodando local e o teste rodando <em>online</em> (óbvio hehe). Fiz uma modificação hoje para deixar o &#8220;worker.js&#8221; já carregado (assim como os demais arquivos &#8220;.js&#8221;).</p>
<p>E como comentário final: tentei deixar os códigos tão similares quanto possível para não afetar significativamente os resultados em favor de uma ou outra forma de cálculo. Sugestões e/ou correções são bem-vindas. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<dl class="references">
<dt>Referências</dt>
<dd>developer.mozilla.org: <a href="https://developer.mozilla.org/En/Using_web_workers">Using web workers</a></dd>
<dd>hacks.mozilla.org: <a href="http://hacks.mozilla.org/2009/07/working-smarter-not-harder/">using web workers: working smarter, not harder</a></dd>
<dd>ejohn.org: <a href="http://ejohn.org/blog/web-workers/">Computing with JavaScript Web Workers</a></dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/web-workers-threads-em-javascript/index.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O progresso dos novos navegadores</title>
		<link>http://blog.klaus.pro.br/2009/ler/o-progresso-dos-novos-navegadores/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/o-progresso-dos-novos-navegadores/index.html#comments</comments>
		<pubDate>Mon, 02 Mar 2009 22:54:58 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desempenho]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Vídeos]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=219</guid>
		<description><![CDATA[Este texto é baseado (uma nota mental pública e estruturada, digamos) na apresentação &#8220;Performance Improvements in Browsers&#8221; feita por &#8220;John Resig&#8220;, que é ninguém menos que o pai da famosa biblioteca jQuery. Abaixo está o vídeo com a apresentação feita (aproximadamente 1h) e na sequência algumas notas e comentários sobre os temas apresentados. Abas separadas [...]]]></description>
			<content:encoded><![CDATA[<p>Este texto é baseado (uma nota mental pública e estruturada, digamos) na apresentação &#8220;<a href="http://ejohn.org/blog/talk-performance-improvements-in-browsers/"><em>Performance Improvements in Browsers</em></a>&#8221; feita por &#8220;<a href="http://ejohn.org/">John Resig</a>&#8220;, que é ninguém menos que o pai da famosa biblioteca <a href="http://jquery.com/">jQuery</a>.</p>
<p>Abaixo está o <a href="http://www.youtube.com/watch?v=13-3VMzfU3Y">vídeo com a apresentação</a> feita (aproximadamente 1h) e na sequência algumas <strong>notas e comentários sobre os temas apresentados</strong>.</p>
<div class="videos"><object width="425" height="344" data="http://www.youtube.com/v/13-3VMzfU3Y&amp;hl=pt-br&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/13-3VMzfU3Y&amp;hl=pt-br&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></div>
<h3 class="subtitles">Abas separadas por processos</h3>
<p>Este é um fato que certamente você deve conhecer. Você está lá navegando tranquilamente com uma <strong>dezena (ou mais =) de abas abertas</strong>&#8230; Daí que você resolve acessar um site com um Javascript mal escrito, com uma animação em que o <a href="http://www.adobe.com/products/flashplayer/">Flash Player</a> se revolta e lá foi, o navegador inteiro congela e não resta outra opção senão matar o processo. Claro que a maioria dos navegadores traz opções para <strong>restaurar a seção anterior</strong> mas não deixa de ser bastante incômodo.</p>
<p>A separação das abas por processos permitiria <strong>matar (encerrar) apenas a aba problemática</strong>, mantendo as outras abas isoladas. Isso por si só já seria uma grande vantagem da separação por abas mas ainda há uma segunda vantagem também bastante interessante! =)</p>
<p>Com a separação em diversos processos o sistema operacional pode <strong>gerenciar melhor o processamento</strong>, alocando mais recursos para as partes onde é realmente necessário, sem congelar as outras partes do navegador.</p>
<p>Vale notar que essa divisão em processos distintos causa um aumento do consumo do memória sim mas, como a quantidade de memória disponível nos PCs atuais (mesmo para os &#8220;PCs de prateleira&#8221;) está deixando de ser um gargalo para o desempenho dos computadores, é de se esperar que os programas passem a fazer alocações maiores de memória. Mais ou menos como o princípio da <strong>lei da oferta e da demanda</strong>.</p>
<h3 class="subtitles">Linearização das instruções de funções</h3>
<p>O termo em inglês acho que permite um entendimento melhor: &#8220;<strong>&#8216;<a href="http://en.wikipedia.org/wiki/Inline_function">function inlining</a></strong>&#8220;. Essa é uma característica que, por exemplo, C++ possui. Usando essa propriedade o compilador pode trocar a chamada de uma função pelo corpo da função, fazendo com que a execução das instruções ocorra <strong>sem o <em>overhead</em> de chamar uma função</strong>.</p>
<p>Além disso, pelo código exibido nos <em>slides</em> parece que, diferentemente do C++, você não precisa dar uma dica para o compilador na hora de escrever a função indicando que a função é candidata ao &#8220;<em>inlining</em>&#8220;.</p>
<h3 class="subtitles">Rede</h3>
<p>Aqui vale destacar o <strong>aumento do número de <em>downloads</em> simultâneos para um mesmo domínio</strong>. Com o IE 7 ainda temos o limite de dois downloads mas, felizmente o IE 8 (beta) já tratá um <strong>limite três vezes maior</strong>, de <a href="http://www.microsoft.com/windows/internet-explorer/beta/readiness/developers-new.aspx#ajax">seis <em>downloads</em> simultâneos para o mesmo domínio</a>. A última versão dos demais navegadores já possui um valor de seis ou sete <em>downloads</em>.</p>
<p>Outro recurso bem legal, e este é uma boa ideia da Microsoft, é o <strong>atributo &#8220;defer&#8221; para a <em>tag</em> &lt;script&gt;</strong>. Esse atributo indica para o navegador que ele pode continuar a <strong>renderizar a página sem esperar o arquivo Javascript</strong> referenciado carregar. O atributo já funcionava no IE e vai funcionar nas novas versões do Firefox e Opera.</p>
<h3 class="subtitles">window.postMessage</h3>
<p>O método <strong>window.postMessage</strong> me chamou a atenção. Com ele será possível a <strong>comunicação entre páginas de domínios distintos</strong> de forma bem simples. O princípio é o seguinte: a página remetente da mensagem irá tentar enviar a mensagem para, por exemplo, um <em>iframe</em> destinatário. Este <em>iframe</em> irá verificar se o remetente é alguém que ele conhece para então aceitar a mensagem e executar alguma ação.</p>
<p>A página que receberá as mensagens pode &#8220;ouvir&#8221; os <strong>eventos de mensagens</strong> usando o tradicional método <a href="https://developer.mozilla.org/En/DOM/Element.addEventListener">addEventListener</a>. Verificando a propriedade <em>origin</em>, a página receptora pode <strong>descobrir pelo domínio se a mensagem está vindo de um destinatário conhecido ou não</strong>.</p>
<h3 class="subtitles">Ajax entre domínios diferentes</h3>
<p>Aquele sonho de fazer requisições Ajax entre os N domínios da sua aplicação está prestes a se realizar. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Adicionando um cabeçalho (<em>header</em>) na resposta da requisição Ajax é possível especificar uma origem (além do próprio domínio) de onde aquela requisição pode ser atendida com segurança. O nome deste cabeçalho é &#8220;<strong>Access-Control-Allow-Origin</strong>&#8221; e está <a href="https://developer.mozilla.org/En/HTTP_Access_Control">melhor descrito nesta página</a>.</p>
<h3 class="subtitles">document.querySelectorAll</h3>
<p>Se você já usou a jQuery sabe como <strong>é prático encontrar os elementos da página usando a sintaxe de CSS</strong>. Melhor ainda se encontrar esses elementos usando a sintaxe de CSS seja possível de ser <strong>feito usando um método nativo do navegador</strong>. É isso que o método <a href="https://developer.mozilla.org/En/DOM/Document.querySelectorAll">document.querySelectorAll</a> permitirá. O melhor de tudo é que as próximas versões do IE, Firefox, Opera e Safari já trarão este método disponível.</p>
<h3 class="subtitles">Visual e CSS</h3>
<p>Adoradas por 10 em cada 10 <em>webdesigners</em>, as <strong>bordas redondas vieram pra ficar</strong>. =) Apesar de os navegadores trazerem implementações com nomes diferentes, todas as implementações funcionam bem. Ou seja, juntando essas propriedades: -moz-border-radius, -webkit-border-radius, -khtml-border-radius e <a href="http://www.w3.org/TR/css3-background/#the-border-radius">border-radius</a> as bordas redondas saem com facilidade.</p>
<p><strong>Sombras também estarão disponíveis</strong>. Nesta página há vários <a href="http://maettig.com/code/css/text-shadow.html">exemplos de uso da propriedade text-shadow</a>.</p>
<p>Outro recurso que certamente vai ser muito usado (e provavelmente muito mal usado também <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) é a possibilidade de se usar <strong><a href="http://ejohn.org/apps/fontface/blok.html">fontes personalizadas na página</a></strong>. Por fontes personalizadas entenda fontes que não estão instaladas na sua máquina. Coisa que já era possível de se fazer no Flash, agora também com CSS.</p>
<p>Além disso, há uma série de <a href="http://www.the-art-of-web.com/css/css-animation/">animações</a> que estarão disponíveis, por enquanto, para Firefox e Safari.</p>
<h3 class="subtitles">Desenho</h3>
<p>O objeto Canvas permite a renderização de elementos numa superfície 2D usando retas, curvas, arcos e/ou círculos. No <a href="https://developer.mozilla.org/">MDC</a> tem um <a href="https://developer.mozilla.org/En/Canvas_tutorial">tutorial bem bacana sobre Canvas</a>. Até me arrisquei a fazer uma &#8220;arte&#8221;: =)</p>
<pre class="javascript"><code><span class="co1">// &lt;canvas id="draw-area" width="150" height="150"&gt;&lt;/canvas&gt; no HTML</span>
<span class="kw2">var</span> canvas = document.<span class="me1">getElementById</span><span class="br0">(</span> <span class="st0">"draw-area"</span> <span class="br0">)</span>;
<span class="kw1">if</span><span class="br0">(</span> !canvas.<span class="me1">getContext</span> <span class="br0">)</span>
<span class="br0">{</span>
  <span class="kw1">return</span>;
<span class="br0">}</span>
<span class="kw2">var</span> context = canvas.<span class="me1">getContext</span><span class="br0">(</span> <span class="st0">"2d"</span> <span class="br0">)</span>;

context.<span class="me1">beginPath</span><span class="br0">(</span><span class="br0">)</span>;
<span class="kw2">var</span> side = <span class="nu0">150</span>;
<span class="kw2">var</span> offset = <span class="nu0">-4</span>;
<span class="kw2">var</span> i = <span class="nu0">0</span>;
<span class="kw1">while</span><span class="br0">(</span> <span class="kw2">true</span> <span class="br0">)</span>
<span class="br0">{</span>
  <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">0</span> <span class="br0">)</span>
  <span class="br0">{</span>
    <span class="kw2">var</span> x = offset + <span class="nu0">4</span>;
    context.<span class="me1">lineTo</span><span class="br0">(</span> x, offset <span class="br0">)</span>;
    offset = x;
    <span class="kw1">if</span><span class="br0">(</span> offset + <span class="nu0">4</span> &gt; <span class="nu0">78</span> <span class="br0">)</span> <span class="co1">// hard-coded mesmo ;P</span>
    <span class="br0">{</span>
      <span class="kw1">break</span>;
    <span class="br0">}</span>
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">1</span> <span class="br0">)</span>
  <span class="br0">{</span>
    context.<span class="me1">lineTo</span><span class="br0">(</span> offset, side - offset <span class="br0">)</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">2</span> <span class="br0">)</span>
  <span class="br0">{</span>
    context.<span class="me1">lineTo</span><span class="br0">(</span> side - offset, side - offset <span class="br0">)</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> i % <span class="nu0">4</span> == <span class="nu0">3</span> <span class="br0">)</span>
  <span class="br0">{</span>
    context.<span class="me1">lineTo</span><span class="br0">(</span> side - offset, offset <span class="br0">)</span>;
  <span class="br0">}</span>
  i++;
<span class="br0">}</span>
<span class="co1">//context.closePath();</span>
context.<span class="me1">stroke</span><span class="br0">(</span><span class="br0">)</span>;</code></pre>
<p>Outro detalhe importante é que o Canvas permitirá também a <strong>inserção de vídeos dentro dele</strong>.</p>
<h3 class="subtitles">JSON nativo</h3>
<p>Atualmente, ao receber uma <em>string</em> em <a href="https://developer.mozilla.org/En/JSON">JSON</a> você precisa usar um <a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval#section_6">eval</a> para recuperar o objeto original. <strong>O eval é conhecidamente lento</strong>, até pelo fato de ser um método genérico, mas era a melhor saída para se ter acesso às informações contidas na <em>string</em> JSON mas, isso vai mudar!</p>
<p>Agora teremos métodos nativos para codificação e decodificação no formato JSON. A única dúvida que me restou é sobre o nome dos métodos. Nos slides os métodos se chamam <strong>encode e decode</strong>, já na <a href="https://developer.mozilla.org/En/Using_JSON_in_Firefox">página do MDC</a> e no <a href="http://wiki.ecmascript.org/doku.php?id=es3.1:json_support">wiki do ECMAScript</a> os métodos se chamam <strong>parse e stringify</strong>, respectivamente.</p>
<h3 class="subtitles">E por fim&#8230;</h3>
<p>&#8230; fico na torcida pra que as novas versões desses navegadores tenham uma rápida adoção por parte dos usuários. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/o-progresso-dos-novos-navegadores/index.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
