<?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>morgamic.com &#187; optimization</title>
	<atom:link href="http://morgamic.com/tag/optimization/feed/" rel="self" type="application/rss+xml" />
	<link>http://morgamic.com</link>
	<description>stuff and things, according to Mike Morgan</description>
	<lastBuildDate>Mon, 19 Jul 2010 05:57:41 +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>Optimizing your JS and CSS</title>
		<link>http://morgamic.com/2009/08/18/optimizing-your-js-and-css/</link>
		<comments>http://morgamic.com/2009/08/18/optimizing-your-js-and-css/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 01:50:43 +0000</pubDate>
		<dc:creator>morgamic</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[optimization]]></category>

		<guid isPermaLink="false">http://morgamic.com/?p=232</guid>
		<description><![CDATA[My coworker Ryan Doherty loves front-end optimization.  A lot.
So much, in fact, that he&#8217;s working on bringing it to the masses.
I just wanted to blog quickly to show the difference CSS and JS compression can make on perceived load time.  I encountered this when working on a new mozilla.com page for download stats.
First, [...]]]></description>
			<content:encoded><![CDATA[<p>My coworker <a href="http://www.ryandoherty.net/">Ryan Doherty</a> loves front-end optimization.  A lot.</p>
<p>So much, in fact, that he&#8217;s working on <a href="https://wiki.mozilla.org/Webdev:Cesium">bringing it to the masses</a>.</p>
<p>I just wanted to blog quickly to show the difference CSS and JS compression can make on perceived load time.  I encountered this when working on a new mozilla.com page for <a href="http://www.mozilla.com/en-US/firefox/stats/">download stats</a>.</p>
<p>First, let&#8217;s look at <a href="http://webpagetest.org/result/090818_23BY/">how we were at the beginning</a>:</p>
<table id="tableResults" class="pretty" align="center" border="1" cellspacing="0">
<tr>
<th align="center" class="empty" valign="middle" style="border:1px white solid;"></th>
<th align="center" class="empty" valign="middle" colspan="3" ></th>
<th align="center" class="border" valign="middle" colspan="3">Document Complete</th>
<th align="center" class="border" valign="middle" colspan="3">Fully Loaded</th>
</tr>
<tr>
<th align="center" class="empty" valign="middle"></th>
<th align="center" valign="middle">Load Time</th>
<th align="center" valign="middle">First Byte</th>
<th align="center" valign="middle">Start Render</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
</tr>
<tr>
<td align="left" valign="middle">First View</td>
<td id="fvLoadTime" valign="middle">16.795s</td>
<td id="fvTTFB" valign="middle">0.992s</td>
<td id="fvStartRender" valign="middle">13.086s</td>
<td id="fvDocComplete" class="border" valign="middle">16.795s</td>
<td id="fvRequestsDoc" valign="middle">51</td>
<td id="fvBytesDoc" valign="middle">309 KB</td>
<td id="fvFullyLoaded" class="border" valign="middle">16.795s</td>
<td id="fvRequests" valign="middle">51</td>
<td id="fvBytes" valign="middle">309 KB</td>
</tr>
<tr>
<td align="left" class="even" valign="middle">Repeat View</td>
<td id="rvLoadTime" class="even" valign="middle">2.533s</td>
<td id="rvTTFB" class="even" valign="middle">0.883s</td>
<td id="rvStartRender" class="even" valign="middle">1.622s</td>
<td id="rvDocComplete" class="even border" valign="middle">2.533s</td>
<td id="rvRequestsDoc" class="even" valign="middle">5</td>
<td id="rvBytesDoc" class="even" valign="middle">19 KB</td>
<td id="rvFullyLoaded" class="even border" valign="middle">2.533s</td>
<td id="rvRequests" class="even" valign="middle">5</td>
<td id="rvBytes" class="even" valign="middle">19 KB</td>
</tr>
</table>
<p>Next, let&#8217;s look at how we were <a href="http://webpagetest.org/result/090818_23CF/">after we concatenated and minified all our JS</a> using <a href="http://developer.yahoo.com/yui/compressor/">YUI compressor</a>:</p>
<table id="tableResults" class="pretty" align="center" border="1" cellspacing="0">
<tr>
<th align="center" class="empty" valign="middle" style="border:1px white solid;"></th>
<th align="center" class="empty" valign="middle" colspan="3" ></th>
<th align="center" class="border" valign="middle" colspan="3">Document Complete</th>
<th align="center" class="border" valign="middle" colspan="3">Fully Loaded</th>
</tr>
<tr>
<th align="center" class="empty" valign="middle"></th>
<th align="center" valign="middle">Load Time</th>
<th align="center" valign="middle">First Byte</th>
<th align="center" valign="middle">Start Render</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
</tr>
<tr>
<td align="left" valign="middle">First View</td>
<td id="fvLoadTime" valign="middle">11.546s</td>
<td id="fvTTFB" valign="middle">0.933s</td>
<td id="fvStartRender" valign="middle">6.455s</td>
<td id="fvDocComplete" class="border" valign="middle">11.546s</td>
<td id="fvRequestsDoc" valign="middle">38</td>
<td id="fvBytesDoc" valign="middle">242 KB</td>
<td id="fvFullyLoaded" class="border" valign="middle">11.546s</td>
<td id="fvRequests" valign="middle">38</td>
<td id="fvBytes" valign="middle">242 KB</td>
</tr>
<tr>
<td align="left" class="even" valign="middle">Repeat View</td>
<td id="rvLoadTime" class="even" valign="middle">2.679s</td>
<td id="rvTTFB" class="even" valign="middle">0.919s</td>
<td id="rvStartRender" class="even" valign="middle">1.671s</td>
<td id="rvDocComplete" class="even border" valign="middle">2.679s</td>
<td id="rvRequestsDoc" class="even" valign="middle">5</td>
<td id="rvBytesDoc" class="even" valign="middle">19 KB</td>
<td id="rvFullyLoaded" class="even border" valign="middle">2.679s</td>
<td id="rvRequests" class="even" valign="middle">5</td>
<td id="rvBytes" class="even" valign="middle">19 KB</td>
</tr>
</table>
<p>Finally, after some prodding from Ryan, I <a href="http://webpagetest.org/result/090818_23CF/">concatenated and minified all CSS</a>:</p>
<table id="tableResults" class="pretty" align="center" border="1" cellspacing="0">
<tr>
<th align="center" class="empty" valign="middle" style="border:1px white solid;"></th>
<th align="center" class="empty" valign="middle" colspan="3" ></th>
<th align="center" class="border" valign="middle" colspan="3">Document Complete</th>
<th align="center" class="border" valign="middle" colspan="3">Fully Loaded</th>
</tr>
<tr>
<th align="center" class="empty" valign="middle"></th>
<th align="center" valign="middle">Load Time</th>
<th align="center" valign="middle">First Byte</th>
<th align="center" valign="middle">Start Render</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
</tr>
<tr>
<td align="left" valign="middle">First View</td>
<td id="fvLoadTime" valign="middle">10.892s</td>
<td id="fvTTFB" valign="middle">0.826s</td>
<td id="fvStartRender" valign="middle">5.732s</td>
<td id="fvDocComplete" class="border" valign="middle">10.892s</td>
<td id="fvRequestsDoc" valign="middle">35</td>
<td id="fvBytesDoc" valign="middle">238 KB</td>
<td id="fvFullyLoaded" class="border" valign="middle">10.892s</td>
<td id="fvRequests" valign="middle">35</td>
<td id="fvBytes" valign="middle">238 KB</td>
</tr>
<tr>
<td align="left" class="even" valign="middle">Repeat View</td>
<td id="rvLoadTime" class="even" valign="middle">2.285s</td>
<td id="rvTTFB" class="even" valign="middle">0.881s</td>
<td id="rvStartRender" class="even" valign="middle">1.435s</td>
<td id="rvDocComplete" class="even border" valign="middle">2.285s</td>
<td id="rvRequestsDoc" class="even" valign="middle">5</td>
<td id="rvBytesDoc" class="even" valign="middle">20 KB</td>
<td id="rvFullyLoaded" class="even border" valign="middle">2.285s</td>
<td id="rvRequests" class="even" valign="middle">5</td>
<td id="rvBytes" class="even" valign="middle">20 KB</td>
</tr>
</table>
<p>In summary, concatenating JS and CSS can make a huge difference, and I saw it today.  Here was the progression:</p>
<ul>
<li>13.086s &#8211; nothing</li>
<li>6.455s &#8211; JS minified</li>
<li>5.732s &#8211; CSS minified</li>
</ul>
<p>We saved about 56% of our load times and reduced the overall number of HTTP requests by 31% (38 down from 51).</p>
<p>Took me about 30 minutes to figure it all out and fix some 404s and path issues caused by moving CSS around.  30 minutes for that kind of improvement is worth the investment.</p>
<p>Note, you&#8217;re going to want to automate using the compressor.  It becomes a pain in the ass to manage over time unless you do.  But it&#8217;s not hard to write a build script to run every time you make an update.  It&#8217;s also not difficult to have production vs. development flags in your site config to flip which css and js files it uses so you don&#8217;t spend time trying to debug a minified bumble of JS or CSS.  Even with minor maintenance and deployment hurdles, it&#8217;s still very worth the trouble.</p>
<p>And don&#8217;t forget, less HTTP requests and bytes transferred means a happier planet.</p>
<p><strong>Update</strong>: after pushing to production, <a href="http://webpagetest.org/result/090819_23DC/">performance was even better</a>:</p>
<table id="tableResults" class="pretty" align="center" border="1" cellspacing="0">
<tr>
<th align="center" class="empty" valign="middle" style="border:1px white solid;"></th>
<th align="center" class="empty" valign="middle" colspan="3" ></th>
<th align="center" class="border" valign="middle" colspan="3">Document Complete</th>
<th align="center" class="border" valign="middle" colspan="3">Fully Loaded</th>
</tr>
<tr>
<th align="center" class="empty" valign="middle"></th>
<th align="center" valign="middle">Load Time</th>
<th align="center" valign="middle">First Byte</th>
<th align="center" valign="middle">Start Render</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
<th align="center" class="border" valign="middle">Time</th>
<th align="center" valign="middle">Requests</th>
<th align="center" valign="middle">Bytes In</th>
</tr>
<tr>
<td align="left" valign="middle">First View</td>
<td id="fvLoadTime" valign="middle">3.707s</td>
<td id="fvTTFB" valign="middle">0.906s</td>
<td id="fvStartRender" valign="middle">3.365s</td>
<td id="fvDocComplete" class="border" valign="middle">3.707s</td>
<td id="fvRequestsDoc" valign="middle">40</td>
<td id="fvBytesDoc" valign="middle">301 KB</td>
<td id="fvFullyLoaded" class="border" valign="middle">4.933s</td>
<td id="fvRequests" valign="middle">48</td>
<td id="fvBytes" valign="middle">313 KB</td>
</tr>
<tr>
<td align="left" class="even" valign="middle">Repeat View</td>
<td id="rvLoadTime" class="even" valign="middle">0.129s</td>
<td id="rvTTFB" class="even" valign="middle">0.601s</td>
<td id="rvStartRender" class="even" valign="middle">0.496s</td>
<td id="rvDocComplete" class="even border" valign="middle">0.129s</td>
<td id="rvRequestsDoc" class="even" valign="middle">2</td>
<td id="rvBytesDoc" class="even" valign="middle">1 KB</td>
<td id="rvFullyLoaded" class="even border" valign="middle">0.781s</td>
<td id="rvRequests" class="even" valign="middle">4</td>
<td id="rvBytes" class="even" valign="middle">2 KB</td>
</tr>
</table>
<p>So yes, it does help to have fast servers, good hardware load balancing, and a quick proxy cache too.  <img src='http://morgamic.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://morgamic.com/2009/08/18/optimizing-your-js-and-css/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
