<?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>Freedev - Tips</title>
	<atom:link href="http://tips.freedev.com.ar/feed/" rel="self" type="application/rss+xml" />
	<link>http://tips.freedev.com.ar</link>
	<description>Técnicas para maximizar la performance en webapps</description>
	<lastBuildDate>Wed, 08 Dec 2010 22:37:48 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Descargar en paralelo el sprite de css</title>
		<link>http://tips.freedev.com.ar/performance/descargar-en-paralelo-el-sprite-de-css/</link>
		<comments>http://tips.freedev.com.ar/performance/descargar-en-paralelo-el-sprite-de-css/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 22:31:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[high performance]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[performance-tip]]></category>
		<category><![CDATA[sprite]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=158</guid>
		<description><![CDATA[Hace unas semanas participe del concurso webperf-contest. Un excelente concurso de WPO con un claro objetivo: mejorar la perfomance de un sitio. Para lograr eso reescribí todo el código frontend aplicando todas las técnicas de WPO que sabía:


Unificar y poner en el head todo el CSS
Unificar el Javascript
Cargar los Javascript de forma Async
Compactar el JS, CSS [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">Hace unas semanas participe del concurso <a href="http://webperf-contest.com/" target="_blank">webperf-contest</a>. Un excelente concurso de WPO con un claro objetivo: mejorar la perfomance de un sitio. Para lograr eso reescribí todo el código frontend aplicando todas las técnicas de WPO que sabía:</div>
<div id="_mcePaste">
<ul>
<li><em>Unificar y poner en el head todo el CSS</em></li>
<li><em>Unificar el Javascript</em></li>
<li><em>Cargar los Javascript de forma Async</em></li>
<li><em>Compactar el JS, CSS y HTML</em></li>
<li><em>carga de imágenes on demand (mi propio plugin)</em></li>
<li><em>Configurar los cache headers </em></li>
<li><em>Sacar el CSS sin usar</em></li>
<li><em>Sacar el JS sin usuar</em></li>
<li><em>Hacer un sprite o dataURI/MHTML para imagenes background</em></li>
<li><em>Ejecutar el JS extra después del evento onLoad</em></li>
<li><em>Unificar los Ajax request</em></li>
<li><em>Cargar el icon de forma Async </em></li>
<li><em>Armar las sombras y bordes redondeados con CSS3</em></li>
<li><em>Optimizar el tamaño de las imá</em><em>genes</em></li>
<li><em>Precargar el Iframe y setear el src en un timer</em></li>
<li><em>Separar en varios dominios base para aumentar la descarga en paralelo</em></li>
</ul>
</div>
<h2>El nuevo Tip</h2>
<div id="_mcePaste">Además, tratando de lograr un mejor tiempo del evento StartRender me di cuenta que <strong>la carga del sprite es clave</strong> para lograrlo.</div>
<h3>En la forma normal de cargar el css y el sprite</h3>
<p><span style="font-weight: normal; font-size: 13px; ">El navegador empieza a descargar la imagen cuando encuentra una regla de sprite en el css que coincide con un tag del body.</span></p>
<div id="_mcePaste">ej:</div>
<pre style="padding-left: 30px;">-HTML document</pre>
<pre style="padding-left: 30px;">......</pre>
<pre style="padding-left: 30px;">&lt;link ref="stylesheet" type="text/css" href="style.css" /&gt;</pre>
<pre style="padding-left: 30px;">&lt;/head&gt;</pre>
<pre style="padding-left: 30px;">&lt;body&gt;</pre>
<pre style="padding-left: 30px;">.....</pre>
<pre style="padding-left: 30px;">-Style.css</pre>
<pre style="padding-left: 30px;">....</pre>
<pre style="padding-left: 30px;">body{ background-image:url(sprite.png); }</pre>
<pre style="padding-left: 30px;">...</pre>
<pre style="text-align: left;"><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;"><em><span style="font-style: normal;"><em>En este caso el navegador descarga primero el css y luego el sprite, la descarga es 100% secuencial.</em></span></em></span></pre>
<div id="_mcePaste">Prueba el <a href="http://tips.freedev.com.ar/demos/parallel-sprite/normal-sprite-load.html" target="_blank">online demo</a> (el style esta con un sleep para la demo ).</div>
<div id="_mcePaste"><em><br />
</em></div>
<div id="_mcePaste"><a href="http://www.webpagetest.org/result/101208_2598/1/details/" target="_blank">Aca puede ver los request de este caso en detalle</a></div>
<div id="_mcePaste" style="text-align: center;"><img class="aligncenter" title="normal" src="http://www.webpagetest.org/results/10/12/08/2598/1_waterfall.png" alt="" width="744" height="83" /></div>
<h3>Descargar Css y sprite en paralelo</h3>
<div id="_mcePaste">Podemos precargar la imagen en el head usando un clasico script como este:</div>
<pre style="padding-left: 30px;">-HTML document</pre>
<pre style="padding-left: 30px;">......</pre>
<pre style="padding-left: 30px;">&lt;script&gt;</pre>
<pre style="padding-left: 30px;"><strong>setTimeout(function(){</strong></pre>
<pre style="padding-left: 30px;"><strong>    var s = document.createElement('image');</strong></pre>
<pre style="padding-left: 30px;"><strong>    s.src =  'sprite.png';</strong></pre>
<pre style="padding-left: 30px;"><strong>    (document.getElementsByTagName('head')[0]).appendChild(s);</strong></pre>
<pre style="padding-left: 30px;"><strong>},5);</strong></pre>
<pre style="padding-left: 30px;">&lt;/script&gt;</pre>
<pre style="padding-left: 30px;">&lt;link ref="stylesheet" type="text/css" href="style.css" /&gt;</pre>
<pre style="padding-left: 30px;">&lt;/head&gt;</pre>
<pre style="padding-left: 30px;">&lt;body&gt;</pre>
<div id="_mcePaste"><em>Ahora, el navegador va a descargar el css y el sprite en paralelo, esto hace que tenga <strong>mucho mas rápido</strong> el sprite.</em></div>
<div><em><br />
</em></div>
<div>Prueba el <a href="http://tips.freedev.com.ar/demos/parallel-sprite/parallel-sprite-load.html" target="_blank">Online Demo</a>.</div>
<div id="_mcePaste"><a href="http://www.webpagetest.org/result/101208_2597/1/details/" target="_blank">El analisis completo</a></div>
<div><a href="http://www.webpagetest.org/result/101208_2597/1/details/"><img class="aligncenter" title="parallel" src="http://www.webpagetest.org/results/10/12/08/2597/1_waterfall.png" alt="" width="744" height="83" /></a></div>
<div>
<h3>Conclusión</h3>
<div>En mi opinión <a href="http://www.phpied.com/inline-mhtml-data-uris/" target="_blank">dataUris/MHTML</a> de Stoyan es mucho mejor técnica, porque nos ahorramos el request del sprite. Sin embargo cuando usamos dataUris tenemos que guardar los datos de la imagen en base64 esto resulta en un 20% mas aprox. También es verdad que es mucho mas común el uso de sprites. Así que para mi <strong>es una buena idea descargar en paralelo el sprite</strong>.</div>
</div>
<div id="_mcePaste"><em>Comentarios bienvenidos.</em></div>
<div id="_mcePaste">Martín <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/performance/descargar-en-paralelo-el-sprite-de-css/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Monitoreo de la performance real con Google Analytics</title>
		<link>http://tips.freedev.com.ar/performance/monitoreo-de-la-performance-real-con-google-analytics/</link>
		<comments>http://tips.freedev.com.ar/performance/monitoreo-de-la-performance-real-con-google-analytics/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 14:14:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[google analytics]]></category>
		<category><![CDATA[monitoreo]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=156</guid>
		<description><![CDATA[(English Version)
Google Analytics es un exelente servicio para poder ver el comportamiento de los visitantes de un site. Con solo copiar y pegar algun script podemos saber un muchas de cosas. Pero este servicio no nos dice nada sobre cuan rapido / lento es nuestro sitio para los visitantes, y como ya hemos hablado muchas [...]]]></description>
			<content:encoded><![CDATA[<p>(<a title="eglish" href="http://tips.freedev.com.ar/en/wpo/google-analytics-web-performance-tracker/">English Version</a>)</p>
<p><strong>Google Analytics</strong> es un exelente servicio para poder ver el comportamiento de los visitantes de un site. Con solo copiar y pegar algun <a href="http://tips.freedev.com.ar/en/wpo/the-evolution-of-ga-js-and-the-best-google-analytics-snippet/">script</a> podemos saber un muchas de cosas. Pero este servicio no nos dice nada sobre cuan rapido / lento es nuestro sitio para los visitantes, y como ya hemos hablado muchas veces, la velocidad es muy importante.</p>
<h4>Entonces, como podemos usar google analytics para poder monitorear la performance real de un sitio?</h4>
<div><a href="http://tips.freedev.com.ar/en/wp-content/uploads/2010/09/download.jpg"><img class="aligncenter size-medium wp-image-21" title="download" src="http://tips.freedev.com.ar/en/wp-content/uploads/2010/09/download-300x178.jpg" alt="" width="500" height="258" /></a></div>
<p>Escribí un pequeño script que usa la función evenTrack de la API de GA y envia a GA las mediciones de performance.  Usando esto, van a poder guardar y analizar de manera muy simple en la misma interfaz web de GA.</p>
<p><span style="color: #000000;"><a title="demo" href="http://tips.freedev.com.ar/demos/ga/performance_tracker.html" target="_blank">Puedes ver un demo aquí</a>.</span></p>
<h2>Pasos</h2>
<div id="_mcePaste">1) Insertar este script <strong>después</strong> del la etiqueta &lt;<strong>head</strong>&gt; :</div>
<div id="_mcePaste">
<pre class="brush:js">&lt;script&gt;
var _gameasures = [['start',(new Date()).getTime()]];
function addGAMearsure(mark){
_gameasures.push([mark,((new Date()).getTime()-_gameasures[0][1])]);
}
&lt;/script&gt;</pre>
</div>
<div id="_mcePaste">2) Insertar este script justo <strong>antes</strong> de la etiqueta <strong> &lt;/body&gt;:</strong></div>
<div id="_mcePaste">
<pre class="brush:js">&lt;script&gt;addMeasure("Perceived Ready Time");function sendGAMeasures(){addMeasure("load");if(_gaq)for(var a=_gameasures.length,b=encodeURI(window.location);a-- &gt;1;)_gameasures.push(["_trackEvent","Performance",b,_gameasures[a][0],_gameasures[a][1]])}if(typeof window.onload=="function"){var prevOnload=window.onload;window.onload=function(){prevOnload();sendGAMeasures()}};&lt;/script&gt;</pre>
</div>
<h2>Opcional</h2>
<div>Si quieres puedes agregar tus propias marcas y mediciones de manera Muuuuuuy facil, solo llamando a la funcion:  <strong>addGAMearsure</strong>(&#8217;my mark&#8217;)  Ej:</div>
<div id="_mcePaste">
<pre class="brush:js">........
&lt;/head&gt;
&lt;body&gt;
&lt;script&gt; addMeasure('Perceived ResponceTime'); &lt;/script&gt;</pre>
</div>
<h2>El código completo (críticas y comentarios son bienvenidos):</h2>
<div id="_mcePaste">
<pre class="brush:js">// mark startTime
var _gameasures = [['start',(new Date()).getTime()]];

//
// Add measure
// @mark string
//
function addMeasure(mark){
    _gameasures.push([mark,((new Date()).getTime()-_gameasures[0][1])]);
}

//
// add load event
//
function sendGAMeasures(){
    //add final measure
    addMeasure('load');

    // if _qaq is defined means that google analytics is set ok
    if(_gaq){

        // set page name
        // by default it get the page url, if you want you can change the value of pname
        var len = _gameasures.length, pname = encodeURI(window.location);

        // send all measures
        while(len-- &gt; 1){
            _gaq.push(['_trackEvent', 'Performance', pname, _gameasures[len][0], _gameasures[len][1]]);
        }
    }
}

// set onload event checking if has been set previoully
if (typeof window.onload != 'function') {
    _sendGAMeasures;
}else{
    var prevOnload = window.onload;
    window.onload = function(){
        prevOnload();
        sendGAMeasures();
    };
}</pre>
</div>
<p>Espero que esto les ayude a monitorear la velocidad de sus sitios.  :)</p>
<p>Martin</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/performance/monitoreo-de-la-performance-real-con-google-analytics/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>La evolucion de ga.js y el mejor script de Google Analytics</title>
		<link>http://tips.freedev.com.ar/performance/la-evolucion-de-ga-js-y-el-mejor-script-de-google-analytics/</link>
		<comments>http://tips.freedev.com.ar/performance/la-evolucion-de-ga-js-y-el-mejor-script-de-google-analytics/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 00:16:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[google analytics]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[optimización]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=152</guid>
		<description><![CDATA[
(The english version)
Hay un muchos articulos que hablan sobre el problema de bloqueo del browser cuando carga archivos externos de js.  En resumen:  cuando el browser encuentra &#60;script src=&#8230;, este bloquea el dibujado de la pagina, hasta que el archivo js es descargado y ejecutado.

Steve Souder presento un completo analisis sobre varias tecnicas para resolver [...]]]></description>
			<content:encoded><![CDATA[<div style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font: normal normal normal 13px/19px Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-family: 'Times New Roman'; line-height: normal; font-size: small; padding: 0.6em; margin: 0px;">
<div id="_mcePaste">(<a href="http://tips.freedev.com.ar/en/wpo/the-evolution-of-ga-js-and-the-best-google-analytics-snippet/">The english version</a>)</div>
<div>Hay un muchos articulos que hablan sobre el problema de bloqueo del browser cuando carga archivos externos de js.  En resumen:  cuando el browser encuentra &lt;script src=&#8230;, este bloquea el dibujado de la pagina, hasta que el archivo js es descargado y ejecutado.</div>
<div><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="script blok" src="http://stevesouders.com/efws/images/scripts-block.gif" alt="" width="402" height="104" /></div>
<div><a href="http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/" target="_blank">Steve Souder</a> presento un completo analisis sobre varias tecnicas para resolver este problema. De las cuales, actualmente yo estoy usando esta:</div>
<div id="_mcePaste">
<pre class="brush:js">(function(d){
   s = d.createElement('script');
   s.src =  'file.js';
   s.type = 'text/javascript';
   (d.getElementsByTagName('head')[0]).appendChild(s);
})(document);</pre>
</div>
<div>Pero encontre hace un tiempo que es mejor reemplazar el la sentencia de closure por un llamado a setTimeout, con parametro 0 milis. El setTimeout tiene un efecto exelente en IE. Descubri ese truco mirando el source de la home de google.com <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .  Mi snippet final es:</div>
<div>
<pre class="brush:js">setTimeout(function(){
   s = document.createElement('script');
   s.src =  'file.js';
   s.type = 'text/javascript';
  (document.getElementsByTagName('head')[0]).appendChild(s);
},0);</pre>
</div>
<div>El widget de terceros mas usado en internet debe ser el script para el tracker de  Google Analytics, y hace unos meses <a href="http://googlecode.blogspot.com/2009/12/google-analytics-launches-asynchronous.html">google </a>anuncio una mejora sobre el script que evitaba el bloqueo. Los cambios principales son: 1) mover el script al head, y 2) cambiar el codigo js por este:</div>
<div>
<pre class="brush:js">var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www')   '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
})();</pre>
</div>
<div>demo: <a href="http://tips.freedev.com.ar/demos/ga/normal_async.html">http://tips.freedev.com.ar/demos/ga/normal_async.html</a></div>
<div id="_mcePaste"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="normal async" src="http://www.webpagetest.org/results/10/08/24/3G3E/1_waterfall.png" alt="" width="930" height="238" /></div>
<div>El analisis <a href="http://www.webpagetest.org/result/100824_3G3E/1/details">completo aca.</a></div>
<div>Encontre varios articulos analizando ese cambio, por ejemplo <a href="http://mathiasbynens.be/notes/async-analytics-snippet" target="_blank">Mathias</a> quien hizo algunas mejoras</div>
<div>
<pre class="brush:js">var _gaq = [['_setAccount', 'UA-XXXXX-X'], ['_trackPageview']];
(function(d, t) {
   var g = d.createElement(t),
   s = d.getElementsByTagName(t)[0];
   g.async = true;
   g.src = '//www.google-analytics.com/ga.js';
   s.parentNode.insertBefore(g, s);
}(document, 'script'));</pre>
</div>
<div>Otro articulo interesante lo hizo  <a href="http://blog.httpwatch.com/2010/08/12/follow-up-asynchronous-google-analytics-is-better-but-not-faster-even-with-ie-6-and-7/" target="_blank">HTTPWatch</a> team, ellos concluyeron que el nuevo script no es mas rapido que el anterior. Pero yo creo que ellos cometieron el error de no realizar las pruebas en un ambiente mas real. Sino que probaron una sola pagina en ambientes ideales.</div>
<div>Sobre el script de Mathias yo hice el <em><span style="color: #800000;">cambio del closure por el setTimeout.</span></em> <strong>Mi script final es</strong>:</div>
<div>
<pre class="brush:js">var _gaq = [['_setAccount', 'UA-XXXXX-X'], ['_trackPageview']];
setTimeout(function() {
   var g = document.createElement('script'),
   s = document.getElementsByTagName('script')[0];
   g.async = true;
   g.src = '//www.google-analytics.com/ga.js';
   s.parentNode.insertBefore(g, s);
},0);</pre>
</div>
<div>demo: <a href="http://tips.freedev.com.ar/demos/ga/timer_async.html">http://tips.freedev.com.ar/demos/ga/timer_async.html</a></div>
<div style="text-align: center;"><img style="border: 0px initial initial;" title="timer load" src="http://www.webpagetest.org/results/10/08/24/3G3N/1_waterfall.png" alt="" width="930" height="238" /></div>
<div id="_mcePaste">The <a href="http://www.webpagetest.org/result/100824_3G3N/1/details">complete analysis</a></div>
<div>Otra buena idea que encontre es llamar el script de carga despues del evento onload, usando <strong> window.onload</strong> = function()&#8230;  pero esta idea tiene un gran problema y es que podes perder un gran porcentaje de tracks si los usuarios dejan la pagina muy rapido.  Pero es la manera mas rapida de cargar el script.  Asi que si no te importa perder algunos tracks de la pagina, este es el mejor metodo.</div>
<div>El script:</div>
<div>
<div>
<pre class="brush:js">var _gaq = [['_setAccount', 'UA-XXXXX-X'], ['_trackPageview']];
window.onload = function() {
   var g = document.createElement('script'),
   s = document.getElementsByTagName('script')[0];
   g.async = true;
   g.src = '//www.google-analytics.com/ga.js';
   s.parentNode.insertBefore(g, s);
};</pre>
</div>
</div>
<div>demo: <a href="http://tips.freedev.com.ar/demos/ga/onload_async.html">http://tips.freedev.com.ar/demos/ga/onload_async.html</a></div>
<div id="_mcePaste" style="text-align: center;"><img style="border: 0px initial initial;" title="onload load" src="http://www.webpagetest.org/results/10/09/03/459P/1_waterfall.png" alt="" width="930" height="204" /></div>
<div id="_mcePaste">El <a href="http://www.webpagetest.org/result/100903_459P/1/details/">complete analysis</a></div>
<p>Martin</p>
<p>Suerte!! <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/performance/la-evolucion-de-ga-js-y-el-mejor-script-de-google-analytics/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Cargar Javascript sin bloquear</title>
		<link>http://tips.freedev.com.ar/performance/cargar-javascript-sin-bloquear/</link>
		<comments>http://tips.freedev.com.ar/performance/cargar-javascript-sin-bloquear/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 12:21:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance-tip]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=146</guid>
		<description><![CDATA[Es sabido que el tag &#60;script&#62; es bloqueante y frena el browser hasta que descarga, compila y ejecuta su contenido, por ende es altamente recomendable poner todos los scripts al final de la pagina para no demorar el rendering de la misma.  Adicionalmente, hay algunas técnicas para cargar de manera asincronica (no bloqueante).
De todos los [...]]]></description>
			<content:encoded><![CDATA[<p>Es sabido que el tag &lt;script&gt; es <strong>bloqueante</strong> y frena el browser hasta que descarga, compila y ejecuta su contenido, por ende es altamente recomendable poner todos los scripts al final de la pagina para no demorar el rendering de la misma.  Adicionalmente, hay<a href="http://www.stevesouders.com/blog/2010/05/11/appendchild-vs-insertbefore/" target="_blank"> algunas técnicas</a> para cargar de manera asincronica (no bloqueante).</p>
<p>De todos los scripts que he probado y utilizado, el que mejor resultado da en todos los browsers es una suma de los estudios de steve souders y un setTimeout que encontre en la home de google, que es muy importante para IE6.</p>
<pre class="brush:js">&lt;script&gt;
setTimeout( function(){
var _s = document.createElement('script');
_s.src ='script_and_style.js';
(document.getElementsByTagName ('head')[0]
|| document.documentElement).appendChild(_s);
},0);
&lt;/script&gt;</pre>
<p>Lo mas importante que vi usando esta técnica es que la mejor posición para llamar al script no es el final de la pagina, sino un poco antes para paralelizar la carga del js con el rendering de la página</p>
<p> <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/performance/cargar-javascript-sin-bloquear/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Load ads defered (without blocking)</title>
		<link>http://tips.freedev.com.ar/performance/load-ads-defered-without-blocking/</link>
		<comments>http://tips.freedev.com.ar/performance/load-ads-defered-without-blocking/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 01:55:42 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[ads loading]]></category>
		<category><![CDATA[adsense]]></category>
		<category><![CDATA[client-side]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[high performance]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance-tip]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=139</guid>
		<description><![CDATA[Load ads defered (without blocking)
Ads&#8217;s scripts are evil, most part of them use document.write to create a new script element, and then it load an other script which make an iframe which load other script which make&#8230;.and finally your page were blocked, not rendering, until ads are loaded.
We solved this problem using a very stupid [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Load ads defered (without blocking)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Ads&#8217;s scripts are evil, most part of them use document.write to create a new script element, and then it load an other script which make an iframe which load other script which make&#8230;.and finally your page were blocked, not rendering, until ads are loaded.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">We solved this problem using a very stupid defer technic. Steps:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">make an empty container where ad has to be showed, ej:  &lt;div id=&#8221;target&#8221;&gt;&lt;/div&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">at bottom page, make second hide container, and put there the ad&#8217;s script, ej:  &lt;div id=&#8221;src&#8221; style=&#8221;display:none;&#8221;&gt; &lt;script&gt; relocateADS(&#8217;target&#8217;,&#8217;src&#8217;); //adsense ej &lt;/script&gt; &lt;/div&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">put relocateADS declaration before src div</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">relocateAds</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">This function is very simple, It just show the src div, and set the absolute position of  target to src. This script use jquery, but it is easy to change if you are not loading jquery</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">The final result: your page will load all content before ads.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"> <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<p><strong><em>Ads&#8217;s scripts are evil</em></strong>, most part of them use document.write to create a new script element, and then it load an other script which make an iframe which load other script which make&#8230;.and finally your page were blocked, not rendering, until ads are loaded.</p>
<p>We solved this problem using a very stupid defer technic. Steps:</p>
<ol>
<li>make an empty container where ad has to be showed, ej:  <span style="color: #993300;"><em>&lt;div id=&#8221;target&#8221;&gt;&lt;/div&gt;</em></span></li>
<li>at bottom page, make second hide container, and put there the ad&#8217;s script, ej:  <span style="color: #993300;"><em>&lt;div id=&#8221;src&#8221; style=&#8221;display:none;&#8221;&gt; &lt;script&gt; relocateADS(&#8217;target&#8217;,&#8217;src&#8217;); //adsense ej &lt;/script&gt; &lt;/div&gt;</em></span></li>
<li>put relocateADS declaration before src div</li>
</ol>
<h3>relocateAds</h3>
<p>This function is very simple, It just show the src div, and set the absolute position of  target to src. This script use jquery, but it is easy to change if you are not loading jquery</p>
<pre></pre>
<p><span style="font-family: 'Times New Roman'; line-height: normal; font-size: small;"></p>
<pre style="word-wrap: break-word; white-space: pre-wrap;"><span style="color: #993300;">/**
 * move all ads dom element from src div to target div now use absolute position
 * to iframe banners
 */
function relocateAds(tgt,src) {
    try{
        //get elements
        var $s = $('#' + src);
        var $t = $('#' + tgt);
        //vars
        var last_pos = 0;
        var last_height = 0;

        //set initial pos and show
        $s.css({position:'absolute'}).show();                   

        /**
         * set interval to check window/components resize
         * on pos change or height change reset
         */
        setInterval(function(){
            var pos = $t.offset();
            if(pos !== last_pos ){
                last_pos = pos;
                $s.css(pos);
            }
            var height = $s.height();
            if(height !== last_height){
                last_height = height;
                $t.css({height:last_height});
            }
        },1000);                

    }catch(e){}

}</span></pre>
<p></span></p>
<h3>The final result: your page will load all content before ads.</h3>
<p> <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/performance/load-ads-defered-without-blocking/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cargar imagenes a demanda y ganar performance</title>
		<link>http://tips.freedev.com.ar/performance/load-images-ondemand-and-get-faster-web/</link>
		<comments>http://tips.freedev.com.ar/performance/load-images-ondemand-and-get-faster-web/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 15:45:50 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[images ondemand]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[performance-tip]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=135</guid>
		<description><![CDATA[(The english version)
Escribí un pequeño script basado en jquery para mejorar la performane al cargar una página. La idea es simple, el script hace que la página cargue solo las imagenes que muestra a medida que el usuario hace scroll. Es muuuuy fácil de usar.
Lo único que tenes que hacer es cambiar la url de la [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tips.freedev.com.ar/en/wpo/load-images-ondemand-and-get-a-faster-web/"><span style="color: #888888;"><em>(The english version)</em></span></a></p>
<p>Escribí un pequeño script basado en jquery para mejorar la performane al cargar una página. La idea es simple, el script hace que la página cargue solo las imagenes que muestra a medida que el usuario hace scroll. Es muuuuy fácil de usar.</p>
<p>Lo único que tenes que hacer es cambiar la url de la imagen a la propiedad <strong>longdesc</strong> y agregar el class <strong>img-ondemand</strong>.</p>
<p>Ej: <span style="color: #800000;">&lt;img src=&#8221;foto.jpg&#8221; /&gt; </span>ahora debería ser <span style="color: #800000;">&lt;img src=&#8221;" longdesc=&#8221;foto.jpg&#8221; class=&#8221;img-ondemand&#8221; /&gt;</span></p>
<p>Aca esta el code los pasos para usarlo:</p>
<p style="padding-left: 30px;"><a href="http://code.google.com/p/jquery-images-ondemand/">http://code.google.com/p/jquery-images-ondemand/</a></p>
<p>Aca tienen un demo online</p>
<p style="padding-left: 30px;"><a href="http://tips.freedev.com.ar/demos/load-images-ondemand.html">http://tips.freedev.com.ar/demos/load-images-ondemand.html</a></p>
<p>Suerte <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span style="background-color: #ffffff;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/performance/load-images-ondemand-and-get-faster-web/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Images ondemand</title>
		<link>http://tips.freedev.com.ar/webapps/images-ondemand/</link>
		<comments>http://tips.freedev.com.ar/webapps/images-ondemand/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 23:23:27 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[webapps]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[imagenes]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance-tip]]></category>
		<category><![CDATA[web site]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=133</guid>
		<description><![CDATA[This is a very easy technique to improve web page performance by implementing the tip &#8220;Make fewer HTTP Requests&#8220;. How? By avoiding downloading images that users  will never see.
For instance, you can see what happens on firebug  when the browser has to download all thumbnails from a popular blog post, which has a [...]]]></description>
			<content:encoded><![CDATA[<p>This is a very easy technique to improve web page performance by implementing the tip &#8220;<a href="http://stevesouders.com/hpws/rule-min-http.php">Make fewer HTTP Requests</a>&#8220;. How? <strong><em>By avoiding downloading images that users  will never see.</em></strong></p>
<p>For instance, you can see what happens on firebug  when the browser has to download all thumbnails from a popular blog post, which has a lot of comments. It&#8217;s clear to see that <em>downloading and rendering </em>each image on those comments consume a l<em>ot of client-side time</em>. Moreover, these images also <em>consume a lot of bandwidth.</em></p>
<p>Another important point is that this kind of pages have a big height and the <strong><em>average user only has 800px</em></strong> of window height. So, what happens whenever a user requests a page, reads something on an interesting banner and decides to click and leave our page: On the one hand,it is always a good thing to get a banner click, but on the other hand, the browser has had to load all images on that page, even when the <span style="text-decoration: underline;">user never scrolls and sees what things there are behind the first&#8217;s 800px. </span><em>Therefore, I know you are very smart, and now you know that &#8220;<strong>scroll</strong>&#8221; is the keyword here.</em></p>
<p>The technique to avoid the previous situation on our pages comprises two parts:<em> frontend and backend.</em></p>
<p>The <em><strong>backend</strong></em> problem is to decide what images are shown by default and what images are &#8220;hidden&#8221; by default. This part of the problem has not a general or common solution which will depend on our backend code. Then we only have to apply a little switch of properties on img tags, and mark this img tags using a css class.</p>
<p>In this example (on php), I define that I want to show 3 firsts comment&#8217;s thumbnail images by default:</p>
<p><span style="color: #800000;">$counter = 0;</span></p>
<p><span style="color: #800000;">foreach($comments as $comment){</span></p>
<p><span style="color: #800000;"> $counter  ;</span></p>
<p><span style="color: #800000;"> if($counter &gt; 3){</span></p>
<p><span style="color: #800000;"> $img = &#8220;&lt;img src=&#8217;img/pix.gif&#8217; longdesc=&#8217;{$comment-&gt;thumbnail_url}&#8217; class=&#8217;image-ondemand&#8217;/&gt;&#8221;;</span></p>
<p><span style="color: #800000;"> }else{</span></p>
<p><span style="color: #800000;"> $img = &#8220;&lt;img src=&#8217;{$comment-&gt;thumbnail_url}&#8217; /&gt;&#8221;;</span></p>
<p><span style="color: #800000;"> }</span></p>
<p><span style="color: #800000;"> echo &#8220;&lt;div&gt; $img &lt;p&gt;{$comment-&gt;content}&lt;/p&gt;&lt;/div&gt;&#8221;;</span></p>
<p><span style="color: #800000;">}</span></p>
<p><span style="color: #800000;"> </span></p>
<p>The <strong>frontent</strong> problem is how to detect on the scroll event the browser, and switch the properties on img tags.</p>
<p>In this example, I use jquery:</p>
<p><span style="color: #800000;">var images_switched = false;</span></p>
<p><span style="color: #800000;">$(window).scroll(function(){</span></p>
<p><span style="color: #800000;"> if(!images_switched){</span></p>
<p><span style="color: #800000;"> images_switch = true;</span></p>
<p><span style="color: #800000;"> $(&#8217;image-ondemand&#8217;).each(function(){</span></p>
<p><span style="color: #800000;"> $(this).attr(&#8217;src&#8217;,$(this).attr(&#8217;longdesc&#8217;));</span></p>
<p><span style="color: #800000;"> });</span></p>
<p><span style="color: #800000;"> }</span></p>
<p><span style="color: #800000;">});</span></p>
<p>I think that it is posible to implement this technique by distincts methods, it is just a example.</p>
<p>Enjoy <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/webapps/images-ondemand/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tip &#8211; Monitoreos de performance, el punto de partida y de fin de cualquier optimización web</title>
		<link>http://tips.freedev.com.ar/webapps/tip-monitoreos-de-performance-el-punto-de-partida-y-de-fin-de-cualquier-optimizacion-web/</link>
		<comments>http://tips.freedev.com.ar/webapps/tip-monitoreos-de-performance-el-punto-de-partida-y-de-fin-de-cualquier-optimizacion-web/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 20:00:29 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[webapps]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[jiffy]]></category>
		<category><![CDATA[monitoreo]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[server-side]]></category>
		<category><![CDATA[web site]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=128</guid>
		<description><![CDATA[Desde hace un tiempo estoy trabajando en varios proyectos de optimización web, sobre todo en abocado al frontend. Y vengo recomendando en este blog algunas coas a tener en cuenta.

Debo decir que mas allá de cual sea la técnica o herramienta que utilicemos para identificar los posibles problemas de performance de nuestro site, y cuales [...]]]></description>
			<content:encoded><![CDATA[<p>Desde hace un tiempo estoy trabajando en varios proyectos de optimización web, sobre todo en abocado al frontend. Y vengo recomendando en este blog algunas coas a tener en cuenta.</p>
<p><img class="aligncenter" src="http://www.techmixer.com/pic/2009/02/monitorus-best-free-website-monitoring-services.jpg" alt="" width="452" height="363" /></p>
<p>Debo decir que mas allá de cual sea la técnica o herramienta que utilicemos para identificar los posibles problemas de performance de nuestro site, y cuales sus posibles soluciones,  lo mas importantes  es tener información REAL que nos da un buen punto de partida, de la performance de nuestro sitio. Y no basta con hace un análisis en un momento desde nuestra PC con YSLOW, lo mas REAL es saber como funciona todo desde otros ambientes (OS, Browser, conexión, país, etc), para eso lo mejor es utilizar algún <strong><em>servicio de monitoreo</em></strong> sobre nuestro site.  Esto nos va a dar la información y estadísticas necesarias para poder ver cual es a lo largo del tiempo el desempeño del site. Y con esa información podremos decidir cuales son los puntos a atacar en el análisis de problemas y en el proceso de optimización, y cual es el verdadero impacto que van a tener.</p>
<p>Adicionalmente, los monitoreos de performance nos permiten definir un nivel de servicio mínimo y disparar alarmas para poder atacar problemas de esta indole.  Por ej: definimos que la url: www.mysite.com/singup, no puede demorar mas de 1.5 seg en contestar. Si el monitor no obtiene una respuesta en ese lapso u obtiene un error, nos da una alarma, por mail o SMS.</p>
<p>Existen 3 tipos de monitoreos de performance que podemos realizar:</p>
<ol>
<li><em><strong>Own Server</strong></em>:  mediante cualquier técnica,  server side,  podemos medir el tiempo que tardan nuestro server en responder cada request. Para ello, solo incluímos algún script en nuestro server (<a href="http://www.google.com.ar/search?sourceid=chrome&amp;ie=UTF-8&amp;q=php+script+log+performance" target="_blank">de los cientos que hay en internet</a>).  Estos script van a guardar un log en cada request.  Esto se usa mayormente para monitorear cual es la performance de nuestro site (server-side).</li>
<li><em><strong>Monitoring Service</strong></em>:  Obviamente si nuestro server se cae o tiene alguna falla, el sistema previo no va a funcionar. Por ello lo mas usado actualmente son los servicios de monitoreo. La verdad que existen cientos, solo basta con <a href="http://www.google.com.ar/search?hl=es&amp;q=website+performance+monitoring+free&amp;btnG=Buscar&amp;meta=" target="_blank">buscar en google</a>. Estos servicios dan muchas características, se puede usar diferentes protocolos, dan reportes muy lindos, flows de alarmas, y plugins para incluir macros y cookies.  De los que he visto, lo mejor que encontre fue: http://mon.itor.us/  y http://watchmouse.com/  <strong> (comenten si ven algo mejor!)</strong></li>
<li><strong><em>Client-measurement</em></strong>:  Un ejemplo de esto es <a href="http://code.google.com/p/jiffy-web/" target="_blank">Jiffy-web</a> , que nos permite incluir en el frontend de nuestro site, un pequeño javascript y podemos agregar las mediciones que nosotros queramos realizar. También trae todo lo necesario server-side, para almacenar esa info y poder analizarla mediante algunos reportes. Lo mejor de esto, es que las mediciones se realizan con los clientes reales, y en ambientes variados. La gente de digg y twitter, usan esto con solo un porcentaje de los request (obviamente no guardan los millones diarios).  Y lo único malo, es que la configuración server-side, no es tan sencilla para cuentas-share y necesita oracle como base de datos.</li>
</ol>
<p>Por ejemplo, con este sencillo código, podríamos medir el tiempo que demora la carga de un script de tercero:</p>
<p><a id="Mark_&amp;_Measure"></p>
<pre style="font-size: 12px; margin-left: 2em; border-left-width: 3px; border-left-style: solid; border-left-color: #cccccc; padding: 0.5em;"><span style="color: #000088;">&lt;script</span><span style="color: #000000;"> </span><span style="color: #660066;">type</span><span style="color: #666600;">=</span><span style="color: #008800;">"text/javascript"</span><span style="color: #000088;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #660066;">Jiffy</span><span style="color: #666600;">.</span><span style="color: #000000;">mark</span><span style="color: #666600;">(</span><span style="color: #008800;">"slowThirdPartyStart"</span><span style="color: #666600;">);</span><span style="color: #000000;">
</span><span style="color: #000088;">&lt;/script&gt;</span><span style="color: #000000;">

</span><span style="color: #000088;">&lt;script</span><span style="color: #000000;"> </span><span style="color: #660066;">type</span><span style="color: #666600;">=</span><span style="color: #008800;">"text/javascript"</span><span style="color: #000000;"> </span><span style="color: #660066;">src</span><span style="color: #666600;">=</span><span style="color: #008800;">"http://www.slowsite.com/slow.js"</span><span style="color: #000088;">&gt;</span><span style="color: #666600;">&lt;</span><span style="color: #008800;">/script&gt;

&lt;script type="text/</span><span style="color: #000000;">javascript</span><span style="color: #008800;">"&gt;</span><span style="color: #000000;">
  </span><span style="color: #660066;">Jiffy</span><span style="color: #666600;">.</span><span style="color: #000000;">measure</span><span style="color: #666600;">(</span><span style="color: #008800;">"slowThirdPartyDone"</span><span style="color: #666600;">,</span><span style="color: #000000;"> </span><span style="color: #008800;">"slowThirdPartyStart"</span><span style="color: #666600;">);</span><span style="color: #000000;">
</span><span style="color: #000088;">&lt;/script&gt;</span></pre>
<p></a></p>
<p>Esta solución es end-to-end, y habra que esperar un poco para que sea mysql friendly.</p>
<p><img class="aligncenter" src="http://jiffy-web.googlecode.com/svn/Jiffy.png" alt="" width="506" height="604" /></p>
<p><strong>En resumen</strong>: <em><span style="color: #800000;"> Es muy importante tener una visión constante, del uso real de los usuarios sobre el sitio y de la performance del mismo. <span style="font-style: normal;"><span style="color: #000000;">Y</span></span></span></em> para eso necesitas datos, cuando mas reales mejor&#8230; el secreto es tener info, analizarla y pensar que cambiar&#8230;  Si estas leyendo esta página sabes el valor que tiene la alta performance en la calidad de un site (google example <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p>
<p>Suerte <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/webapps/tip-monitoreos-de-performance-el-punto-de-partida-y-de-fin-de-cualquier-optimizacion-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>tip 14 &#8211; Optimización de Imagenes</title>
		<link>http://tips.freedev.com.ar/performance/tip-14-optimizacion-de-imagenes/</link>
		<comments>http://tips.freedev.com.ar/performance/tip-14-optimizacion-de-imagenes/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 13:05:06 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[client-side]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[imagenes]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[web site]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=123</guid>
		<description><![CDATA[Resumen:
En estos tips vamos a ver las 4 técnicas mas útiles y simples para la optimización de imagenes para una web. Inclusive técnicas con los últimos adelantos de css y los render engine.  Los Tips de performance que vamos a desarrollar son:

Formato, tamaño y compresión adecuada
Convinar en css sprites
Cache para imagenes
Usar CSS Gradients para efectos

El [...]]]></description>
			<content:encoded><![CDATA[<h3>Resumen:</h3>
<p>En estos tips vamos a ver las 4 técnicas mas útiles y simples para la optimización de imagenes para una web. Inclusive técnicas con los últimos adelantos de css y los render engine.  Los Tips de performance que vamos a desarrollar son:</p>
<ol>
<li>Formato, tamaño y compresión adecuada</li>
<li>Convinar en css sprites</li>
<li>Cache para imagenes</li>
<li>Usar CSS Gradients para efectos</li>
</ol>
<h3>El problema:</h3>
<p>En el común de los websites o webapps que se desarrollan actualmente, las imagenes son altamente utilizadas, tanto para cuestiones propias de una imagen, como para cuestiones estéticas del site.  Esto hace que mas del 70% del peso de una página sean imagenes, y por ende mas del 70% del tiempo de carga depende de este factor. Asi que no podemos dejar de darle una gran atención a la hora de pensar en la optimización.</p>
<p>Un ejemplo de esto es el diario <a href="http://elpais.es" target="_blank">elpais.es</a>, de los 500k que tiene, 370k son de imágenes. Donde hay exactamente 102 imágenes. Haciendo  un análisis de los tipos  y usos de imágenes, se puede ver que las mismas pueden reducirse a 43 con un peso total de 115k. Lo que nos da una ganancia de 255k, <span style="color: #800000;"><em>mas del 50% del peso total </em></span>de la página.  Si pensamos que en cada request estamos desperdiciando esa gran cantidad de bandwidth, y eso en nuestro negocio se traduce a $$$. Y peor aún, perdida de calidad de nuestro sitio en la impresión de los usuarios.</p>
<p>De modo que debemos poner mucha atención a la hora de incluir imágenes a nuestro site.  A continuación, técnicas y herramientas para resolver este problema.</p>
<p>&#8230;. continuará</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/performance/tip-14-optimizacion-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>tip 13 &#8211; Reducir la cantidad de Ajax Request</title>
		<link>http://tips.freedev.com.ar/webapps/reducir-ajax-request/</link>
		<comments>http://tips.freedev.com.ar/webapps/reducir-ajax-request/#comments</comments>
		<pubDate>Thu, 28 May 2009 12:51:11 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[webapps]]></category>
		<category><![CDATA[high performance]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[request]]></category>

		<guid isPermaLink="false">http://tips.freedev.com.ar/?p=100</guid>
		<description><![CDATA[tip : utilizar alguna técnica de &#8220;Multi Part Ajax Request&#8221;
Como ya sabemos, las webapp o website desarrollados con la técnica de ajax tienen muchísimas ventajas en performance y usabilidad sobre las webapps hechas con la clásica arquitectura  request-response.  Pero también es sabido que el costo de cada Request del navegador suele ser el mas caro a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><strong><em><span style="font-family: mceinline;">tip : utilizar alguna técnica de &#8220;Multi Part Ajax Request&#8221;</span></em></strong></p>
<p>Como ya sabemos, las webapp o website desarrollados con la técnica de ajax tienen muchísimas ventajas en performance y usabilidad sobre las webapps hechas con la clásica arquitectura  request-response.  Pero también es sabido que el costo de cada Request del navegador suele ser el mas caro a la hora de evaluar un loading. Por ende minimizar los request redunda en ventajas de performance.</p>
<p>Mirando en detalle cualquier webapp que tenga un alto porcentaje de ajax (request bajo XHR o XMLHTTPRequest), entendemos que cada acción realizada en la pagina desencadena una gran cantidad XHR request al server.  Por ejemplo: Agregar un dato en el formulario en un clásico List-Detail, generaría al menos 2 request en un diseño clásico. Uno para insertar los datos y otro para obtener el nuevo List.  En mi experiencia en webapps, la mayoría de las acciones desencadenan entre 3 a 4 request. Y observando Gmail, como una clásica webapp en ajax, podemos ver que son mas de 10 los request que generan cada simple acción como enviar un mail.</p>
<p>Al analizar el tiempo que tiene cada request de ajax, donde generalmente la cantidad de datos transmitidos son menores a 1 o 2k, vemos que el <em>90%</em> del mismo esta en establecer la conexión con el servidor. Con este dato podemos ver facilmente <strong>el problema</strong>:</p>
<p><em><span style="font-family: mceinline;">Estamos desperdiciando mucho tiempo en establecer las conexiones de multiples XHR Request. </span></em></p>
<p><strong>La solución</strong> parece evidente, aunque no es algo altamente popular:</p>
<p><span style="font-family: mceinline;"> </span><em><span style="font-family: mceinline;">Debemos reducir la cantidad de XHR Request, unificando varios request dentro de uno.</span></em></p>
<p>De ese modo podemos enviar varios datos y recibir varios datos en un solo request.  Obviamente que empaquetar y desempaquetar varios request tiene un costo. Lo mejor sera encontrar la relación justa entre la cantidad de request y el costo de empaquetado. Y esto varia según el algoritmo que se use.</p>
<p>Recientemente Micah Snyder de Digg Technology ha <a href="http://blog.digg.com/?p=621" target="_blank">publicado</a> un post sobre DUI.Stream, que es una librería Javascript que justamente empaqueta varias request de manera transparente. Es el primer trabajo serio que se ve en este sentido. Y podemos observar la gran diferencia performance en esta <a href="http://demos.digg.com/stream/imageDemo.html" target="_blank">demo</a>.</p>
<p>Suerte <img src='http://tips.freedev.com.ar/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tips.freedev.com.ar/webapps/reducir-ajax-request/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

