{"id":869,"date":"2010-01-12T14:16:11","date_gmt":"2010-01-12T22:16:11","guid":{"rendered":"http:\/\/blog.mozilla.org\/webdev\/?p=869"},"modified":"2010-01-12T17:24:20","modified_gmt":"2010-01-13T01:24:20","slug":"making-getpersonas-com-blazing-fast","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/","title":{"rendered":"Making getpersonas.com blazing fast"},"content":{"rendered":"<p>I love speed. I&#8217;m a speed fanatic. Fast cars, planes, skydiving, anything involving triple digit MPH. But the thing that I like fast the most is websites. Millisecond response times, content delivery networks, caching, sprites, you name it. <\/p>\n<p>In case you didn&#8217;t already know, Personas (AKA &#8216;lightweight themes&#8217;) have been integrated into Firefox 3.6. With the impeding tsunami of traffic from millions of Firefox users headed towards getpersonas.com, I knew my time had come. Donning Firebug, YSlow and <a href=\"http:\/\/webpagetest.org\">webpagetest.org<\/a>, I set out to squeeze every last drop of performance out of it.<\/p>\n<p>I knew my work would be painstaking, arduous and gut-wrenching, but I couldn&#8217;t let the fear of disappointing millions of Firefox users around the world stop me. <\/p>\n<h3>Minify<\/h3>\n<p>My first task: concatenation and minification of JavaScript and CSS. My weapon of choice: <a href=\"http:\/\/code.google.com\/p\/minify\/\">Minify<\/a>.<\/p>\n<p>Minify is a neat little PHP library that will take a list of CSS or JavaScript files, concatenate into one file, minify (remove whitespace and linebreaks) and gzip them. The plus is it doesn&#8217;t involve running any code before you push your files live, you can point your CSS &#038; JavaScript URLs directly at Minify like so: http:\/\/getpersonas-cdn.mozilla.net\/static\/min\/?g=css&#038;r=59272. (g=css tells Minify I want the &#8216;css&#8217; group of files)<\/p>\n<p>The benefits of Minify are less HTTP requests and small file sizes due to minification and gzip. For getpersonas.com, 3 JavaScript files were reduced to 1<sup>1<\/sup>.<\/p>\n<h3>Move JavaScript to the bottom of all pages<\/h3>\n<p>Next, in order to make getpersonas.com <strong>appear<\/strong> faster, I knew I had to move JavaScript to the bottom of every page.<\/p>\n<p>From a <a href=\"http:\/\/www.webpagetest.org\/result\/091014_2GTP\/1\/details\/\">previous test on webpagetest.org<\/a>, it was apparent that users were waiting for the JavaScript in the head of the page to download before any other content. This is a well-known &#8216;feature&#8217; of all web browsers. <a href=\"http:\/\/developer.yahoo.com\/performance\/rules.html#js_bottom\">JavaScript blocks parallel downloading for all hostnames<\/a>, period. The remedy? Move JavaScript to the end of the page.<\/p>\n<p>Thankfully I hadn&#8217;t written any inline JavaScript, so moving the reference to the main JavaScript file to the bottom of every page was relatively simple. The benefit? <strong>Rendering of each page started 500ms earlier<\/strong>. While seemingly small, half a second is enough for a user to detect.<\/p>\n<h3>Add far-future expires headers<\/h3>\n<p>My next task? Adding far-future expires headers to all CSS, JS and images.<\/p>\n<p>When visitors browse your website, they often view multiple pages that share common resources. Images, CSS, JavaScript, etc. Unfortunately, browsers need to check each file on every page load to see if it has changed. This requires many requests to the webserver, each incurring a non-trivial cost, sometimes in the hundreds of milliseconds. The method to avoid this is to use far-future expires headers.<\/p>\n<p>Expires headers tell browsers how long they can store a file in their cache. If the expires headers tell browsers to cache a file for a long time, the browser doesn&#8217;t need to check to see if it has changed. This is what they look like:<\/p>\n<p><code>Expires: Thu, 15 Apr 2020 20:00:00 GMT<\/code><\/p>\n<p>In this case, the file doesn&#8217;t expire until April 15, 2020 at 8:00pm. Adding this to a .htaccess file in \/static gave all our images proper expires headers:<\/p>\n<p><code>&lt;FilesMatch \"\\.(jpg|jpeg|png|gif|ico)$\"&gt;<br \/>\nExpiresActive On<br \/>\nExpiresDefault \"access plus 10 years\"<br \/>\n&lt;\/FilesMatch&gt;<\/code><\/p>\n<p>&#8220;But wait!&#8221;, you say. How will browsers know when the file has changed if it never checks for a new version? Easy, change the filename or append a query string. All persona images have a modified timestamp at the end of their URLs: http:\/\/getpersonas-cdn.mozilla.net\/static\/8\/8\/48888\/preview.jpg?1260925626 and CSS &#038; JavaScript have their SVN revision number instead: http:\/\/getpersonas-cdn.mozilla.net\/static\/min\/?g=js&#038;r=59113. (And Minify is configured to send far-future expires headers) For &#8216;regular&#8217; images used throughout the site appending a new version # to the end of the url is easy enough.<\/p>\n<p>For users, this means a faster <strong>overall<\/strong> site. Repeat view time decreased from 1.6 seconds to 0.7 seconds. <\/p>\n<h3>Use a CDN<\/h3>\n<p>Last but not least, we needed to move our content closer to users around the world. How? A content delivery network (CDN).<\/p>\n<p>A big problem with the Internet is people all around the world use it. Sometimes from thousands of miles away from your webserver. Fiber optic cables under the ocean may be fast, but 50 or 100ms of round-trip time adds up when users need to download dozens of files. Short of inventing faster-than-light communication, the next easiest thing to do is move your content closer to your users.<\/p>\n<p>Instead of buying our own servers and copying files to them, we&#8217;re using a CDN for getpersonas.com. A CDN has servers set up around the world and has done all the hard work for us already \ud83d\ude42 .<\/p>\n<p>All our images, JavaScript and CSS are served from the CDN&#8217;s servers. The way we achieved this is by setting up a separate hostname that points to them (getpersonas-cdn.mozilla.net). When a browser requests a file from getpersonas-cdn.mozilla.net, the CDN fetches it from our webservers, caches it (because of our far-future expires headers \ud83d\ude42 ) and serves it to the browser.<\/p>\n<p>Since our CDN has servers in multiple locations around the world, users download files faster and with better latency. <\/p>\n<h3>Results?<\/h3>\n<p>This post wouldn&#8217;t be worth reading without some pretty charts and graphs now would it? (Results according to <a href=\"http:\/\/webpagetest.org\">webpagetest.org<\/a>, a great performance tester)<\/p>\n<h4>Summary:<\/h4>\n<ul>\n<li>500ms earlier rendering start time<\/li>\n<li>300ms shorter download time (most likely even faster for users across the globe)<\/li>\n<li>&gt;2x increase in repeat view speed<\/li>\n<\/ul>\n<h4>Before:<\/h4>\n<table id=\"tableResults\" class=\"pretty\" align=\"center\" border=\"1\" cellpadding=\"10\" cellspacing=\"0\">\n<tr>\n<th align=\"center\" class=\"empty\" valign=\"middle\" style=\"border:1px white solid;\"><\/th>\n<th align=\"center\" class=\"empty\" valign=\"middle\" colspan=\"3\" ><\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\" colspan=\"4\">Document Complete<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\" colspan=\"3\">Fully Loaded<\/th>\n<\/tr>\n<tr>\n<th align=\"center\" class=\"empty\" valign=\"middle\"><\/th>\n<th align=\"center\" valign=\"middle\">Load Time<\/th>\n<th align=\"center\" valign=\"middle\">First Byte<\/th>\n<th align=\"center\" valign=\"middle\">Start Render<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\">Time<\/th>\n<th align=\"center\" valign=\"middle\">Requests<\/th>\n<th align=\"center\" valign=\"middle\">Bytes In<\/th>\n<th align=\"center\" valign=\"middle\">Bandwidth<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\">Time<\/th>\n<th align=\"center\" valign=\"middle\">Requests<\/th>\n<th align=\"center\" valign=\"middle\">Bytes In<\/th>\n<\/tr>\n<tr>\n<td align=\"left\" valign=\"middle\">First View<\/td>\n<td id=\"fvLoadTime\" valign=\"middle\">3.617s<\/td>\n<td id=\"fvTTFB\" valign=\"middle\">0.792s<\/td>\n<td id=\"fvStartRender\" valign=\"middle\">1.763s<\/td>\n<td id=\"fvDocComplete\" class=\"border\" valign=\"middle\">3.617s<\/td>\n<td id=\"fvRequestsDoc\" valign=\"middle\">26<\/td>\n<td id=\"fvBytesDoc\" valign=\"middle\">305 KB<\/td>\n<td id=\"fvBandwidth\" valign=\"middle\">885.23 Kbps<\/td>\n<td id=\"fvFullyLoaded\" class=\"border\" valign=\"middle\">3.617s<\/td>\n<td id=\"fvRequests\" valign=\"middle\">26<\/td>\n<td id=\"fvBytes\" valign=\"middle\">305 KB<\/td>\n<\/tr>\n<tr>\n<td align=\"left\" class=\"even\" valign=\"middle\">Repeat View<\/td>\n<td id=\"rvLoadTime\" class=\"even\" valign=\"middle\">1.638s<\/td>\n<td id=\"rvTTFB\" class=\"even\" valign=\"middle\">0.418s<\/td>\n<td id=\"rvStartRender\" class=\"even\" valign=\"middle\">0.906s<\/td>\n<td id=\"rvDocComplete\" class=\"even border\" valign=\"middle\">1.638s<\/td>\n<td id=\"rvRequestsDoc\" class=\"even\" valign=\"middle\">26<\/td>\n<td id=\"rvBytesDoc\" class=\"even\" valign=\"middle\">10 KB<\/td>\n<td id=\"rvBandwidth\" class=\"even\" valign=\"middle\">N\/\/A<\/td>\n<td id=\"rvFullyLoaded\" class=\"even border\" valign=\"middle\">1.830s<\/td>\n<td id=\"rvRequests\" class=\"even\" valign=\"middle\">26<\/td>\n<td id=\"rvBytes\" class=\"even\" valign=\"middle\">10 KB<\/td>\n<\/tr>\n<\/table>\n<p><a href=\"http:\/\/www.webpagetest.org\/result\/091231_3Y1V\/\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png\" alt=\"before\" title=\"before\" width=\"790\" height=\"444\" class=\"alignnone size-full wp-image-890\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png 790w, https:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2-300x168.png 300w\" sizes=\"(max-width: 790px) 100vw, 790px\" \/><\/a><\/p>\n<h4>After<\/h4>\n<table id=\"tableResults\" class=\"pretty\" align=\"center\" border=\"1\" cellpadding=\"10\" cellspacing=\"0\">\n<tr>\n<th align=\"center\" class=\"empty\" valign=\"middle\" style=\"border:1px white solid;\"><\/th>\n<th align=\"center\" class=\"empty\" valign=\"middle\" colspan=\"3\" ><\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\" colspan=\"4\">Document Complete<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\" colspan=\"3\">Fully Loaded<\/th>\n<\/tr>\n<tr>\n<th align=\"center\" class=\"empty\" valign=\"middle\"><\/th>\n<th align=\"center\" valign=\"middle\">Load Time<\/th>\n<th align=\"center\" valign=\"middle\">First Byte<\/th>\n<th align=\"center\" valign=\"middle\">Start Render<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\">Time<\/th>\n<th align=\"center\" valign=\"middle\">Requests<\/th>\n<th align=\"center\" valign=\"middle\">Bytes In<\/th>\n<th align=\"center\" valign=\"middle\">Bandwidth<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\">Time<\/th>\n<th align=\"center\" valign=\"middle\">Requests<\/th>\n<th align=\"center\" valign=\"middle\">Bytes In<\/th>\n<\/tr>\n<tr>\n<td align=\"left\" valign=\"middle\">First View<\/td>\n<td id=\"fvLoadTime\" valign=\"middle\">3.312s<\/td>\n<td id=\"fvTTFB\" valign=\"middle\">0.780s<\/td>\n<td id=\"fvStartRender\" valign=\"middle\">1.306s<\/td>\n<td id=\"fvDocComplete\" class=\"border\" valign=\"middle\">3.312s<\/td>\n<td id=\"fvRequestsDoc\" valign=\"middle\">25<\/td>\n<td id=\"fvBytesDoc\" valign=\"middle\">318 KB<\/td>\n<td id=\"fvBandwidth\" valign=\"middle\">1.03 Mbps<\/td>\n<td id=\"fvFullyLoaded\" class=\"border\" valign=\"middle\">3.312s<\/td>\n<td id=\"fvRequests\" valign=\"middle\">25<\/td>\n<td id=\"fvBytes\" valign=\"middle\">318 KB<\/td>\n<\/tr>\n<tr>\n<td align=\"left\" class=\"even\" valign=\"middle\">Repeat View<\/td>\n<td id=\"rvLoadTime\" class=\"even\" valign=\"middle\">0.730s<\/td>\n<td id=\"rvTTFB\" class=\"even\" valign=\"middle\">0.430s<\/td>\n<td id=\"rvStartRender\" class=\"even\" valign=\"middle\">0.534s<\/td>\n<td id=\"rvDocComplete\" class=\"even border\" valign=\"middle\">0.730s<\/td>\n<td id=\"rvRequestsDoc\" class=\"even\" valign=\"middle\">2<\/td>\n<td id=\"rvBytesDoc\" class=\"even\" valign=\"middle\">8 KB<\/td>\n<td id=\"rvBandwidth\" class=\"even\" valign=\"middle\">N\/\/A<\/td>\n<td id=\"rvFullyLoaded\" class=\"even border\" valign=\"middle\">1.153s<\/td>\n<td id=\"rvRequests\" class=\"even\" valign=\"middle\">2<\/td>\n<td id=\"rvBytes\" class=\"even\" valign=\"middle\">8 KB<\/td>\n<\/tr>\n<\/table>\n<p><a href=\"http:\/\/www.webpagetest.org\/result\/100112_4872\/\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/after.png\" alt=\"after\" title=\"after\" width=\"790\" height=\"434\" class=\"alignnone size-full wp-image-885\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/after.png 790w, https:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/after-300x164.png 300w\" sizes=\"(max-width: 790px) 100vw, 790px\" \/><\/a><\/p>\n<h3>One more thing:<\/h4>\n<p>For an overview of how much we&#8217;ve sped up getpersonas.com since October 2009, here&#8217;s a speed test from then (before a site redesign):<\/p>\n<table id=\"tableResults\" class=\"pretty\" align=\"center\" border=\"1\" cellpadding=\"10\" cellspacing=\"0\">\n<tr>\n<th align=\"center\" class=\"empty\" valign=\"middle\" style=\"border:1px white solid;\"><\/th>\n<th align=\"center\" class=\"empty\" valign=\"middle\" colspan=\"3\" ><\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\" colspan=\"4\">Document Complete<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\" colspan=\"3\">Fully Loaded<\/th>\n<\/tr>\n<tr>\n<th align=\"center\" class=\"empty\" valign=\"middle\"><\/th>\n<th align=\"center\" valign=\"middle\">Load Time<\/th>\n<th align=\"center\" valign=\"middle\">First Byte<\/th>\n<th align=\"center\" valign=\"middle\">Start Render<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\">Time<\/th>\n<th align=\"center\" valign=\"middle\">Requests<\/th>\n<th align=\"center\" valign=\"middle\">Bytes In<\/th>\n<th align=\"center\" valign=\"middle\">Bandwidth<\/th>\n<th align=\"center\" class=\"border\" valign=\"middle\">Time<\/th>\n<th align=\"center\" valign=\"middle\">Requests<\/th>\n<th align=\"center\" valign=\"middle\">Bytes In<\/th>\n<\/tr>\n<tr>\n<td align=\"left\" valign=\"middle\">First View<\/td>\n<td id=\"fvLoadTime\" valign=\"middle\">5.225s<\/td>\n<td id=\"fvTTFB\" valign=\"middle\">0.782s<\/td>\n<td id=\"fvStartRender\" valign=\"middle\">2.937s<\/td>\n<td id=\"fvDocComplete\" class=\"border\" valign=\"middle\">5.225s<\/td>\n<td id=\"fvRequestsDoc\" valign=\"middle\">27<\/td>\n<td id=\"fvBytesDoc\" valign=\"middle\">487 KB<\/td>\n<td id=\"fvBandwidth\" valign=\"middle\">898.34 Kbps<\/td>\n<td id=\"fvFullyLoaded\" class=\"border\" valign=\"middle\">5.460s<\/td>\n<td id=\"fvRequests\" valign=\"middle\">27<\/td>\n<td id=\"fvBytes\" valign=\"middle\">487 KB<\/td>\n<\/tr>\n<tr>\n<td align=\"left\" class=\"even\" valign=\"middle\">Repeat View<\/td>\n<td id=\"rvLoadTime\" class=\"even\" valign=\"middle\">61.028s<\/td>\n<td id=\"rvTTFB\" class=\"even\" valign=\"middle\">0.433s<\/td>\n<td id=\"rvStartRender\" class=\"even\" valign=\"middle\">13.087s<\/td>\n<td id=\"rvDocComplete\" class=\"even border\" valign=\"middle\">61.028s<\/td>\n<td id=\"rvRequestsDoc\" class=\"even\" valign=\"middle\">27<\/td>\n<td id=\"rvBytesDoc\" class=\"even\" valign=\"middle\">27 KB<\/td>\n<td id=\"rvBandwidth\" class=\"even\" valign=\"middle\">N\/\/A<\/td>\n<td id=\"rvFullyLoaded\" class=\"even border\" valign=\"middle\">61.028s<\/td>\n<td id=\"rvRequests\" class=\"even\" valign=\"middle\">27<\/td>\n<td id=\"rvBytes\" class=\"even\" valign=\"middle\">27 KB<\/td>\n<\/tr>\n<\/table>\n<p><a href=\"http:\/\/www.webpagetest.org\/result\/091014_2GTP\/\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before-redesign.png\" alt=\"before redesign\" title=\"before redesign\" width=\"790\" height=\"457\" class=\"alignnone size-full wp-image-903\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before-redesign.png 790w, https:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before-redesign-300x173.png 300w\" sizes=\"(max-width: 790px) 100vw, 790px\" \/><\/a><\/p>\n<p>That&#8217;s a decrease of <strong>two seconds<\/strong> in download time and rendering starts 1.7 seconds earlier. Not bad, eh?<\/p>\n<p>[1]: An additional JavaScript file was added between tests shown at bottom of post.<\/p>\n<p>Special thanks to Stephen Donner, Krupa Raj, Jeremy Orem and Matthew Zeier for their hard work in making getpersonas.com blazing fast.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I love speed. I&#8217;m a speed fanatic. Fast cars, planes, skydiving, anything involving triple digit MPH. But the thing that I like fast the most is websites. Millisecond response times, content delivery networks, caching, sprites, you name it. In case &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/\">Continue reading<\/a><\/p>\n","protected":false},"author":1438,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[311,551,288],"tags":[],"coauthors":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Making getpersonas.com blazing fast - Mozilla Web Development<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"mozilla\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/\",\"url\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/\",\"name\":\"Making getpersonas.com blazing fast - Mozilla Web Development\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png\",\"datePublished\":\"2010-01-12T22:16:11+00:00\",\"dateModified\":\"2010-01-13T01:24:20+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/70ae25c16f09d053c6d8b5eac29dbda9\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#primaryimage\",\"url\":\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png\",\"contentUrl\":\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/webdev\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Making getpersonas.com blazing fast\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#website\",\"url\":\"https:\/\/blog.mozilla.org\/webdev\/\",\"name\":\"Mozilla Web Development\",\"description\":\"For make benefit of glorious tubes\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.mozilla.org\/webdev\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/70ae25c16f09d053c6d8b5eac29dbda9\",\"name\":\"mozilla\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/image\/e77ee64829d0c3831212656324f746d1\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/75d2017e019c87560fe5d148a64659dc?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/75d2017e019c87560fe5d148a64659dc?s=96&d=mm&r=g\",\"caption\":\"mozilla\"},\"url\":\"https:\/\/blog.mozilla.org\/webdev\/author\/mozilla-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Making getpersonas.com blazing fast - Mozilla Web Development","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/","twitter_misc":{"Written by":"mozilla","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/","url":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/","name":"Making getpersonas.com blazing fast - Mozilla Web Development","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/webdev\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png","datePublished":"2010-01-12T22:16:11+00:00","dateModified":"2010-01-13T01:24:20+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/70ae25c16f09d053c6d8b5eac29dbda9"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#primaryimage","url":"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png","contentUrl":"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/01\/before2.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/01\/12\/making-getpersonas-com-blazing-fast\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/webdev\/"},{"@type":"ListItem","position":2,"name":"Making getpersonas.com blazing fast"}]},{"@type":"WebSite","@id":"https:\/\/blog.mozilla.org\/webdev\/#website","url":"https:\/\/blog.mozilla.org\/webdev\/","name":"Mozilla Web Development","description":"For make benefit of glorious tubes","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.mozilla.org\/webdev\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/70ae25c16f09d053c6d8b5eac29dbda9","name":"mozilla","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/image\/e77ee64829d0c3831212656324f746d1","url":"https:\/\/secure.gravatar.com\/avatar\/75d2017e019c87560fe5d148a64659dc?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/75d2017e019c87560fe5d148a64659dc?s=96&d=mm&r=g","caption":"mozilla"},"url":"https:\/\/blog.mozilla.org\/webdev\/author\/mozilla-2\/"}]}},"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts\/869"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/users\/1438"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/comments?post=869"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts\/869\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/media?parent=869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/categories?post=869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/tags?post=869"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/coauthors?post=869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}