SpeedCurve Blog https://speedcurve.com/blog/ Speed matters. Get the latest on how the areas of design and performance overlap with a focus on creating great user experiences. Introducing Page Speed Benchmarks – a new resource for the performance community https://speedcurve.com/blog/page-speed-benchmarks <p dir="ltr"><a href="/benchmarks/" target="_blank" rel="noopener"><br /><img class="blog-img" src="https://img.speedcurve.com/blog/benchmarks-header2.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">Here are some common questions I&rsquo;m asked when I talk with people about performance:</p> <ul> <li dir="ltr" role="presentation">Which metrics should I care about?</li> <li dir="ltr" role="presentation">What types of devices and connections should I test on?</li> <li dir="ltr" role="presentation">Which third parties should I be most concerned about?</li> <li dir="ltr" role="presentation">How fast should I be?</li> <li dir="ltr" role="presentation">What are some good sites I can use for benchmarking?</li> </ul> <p dir="ltr">Today, I&rsquo;m very excited to announce the release of a new project that helps answer those questions &ndash; and more!&nbsp;</p> <p dir="ltr"><strong><a href="/benchmarks/" target="_blank" rel="noopener">Page Speed Benchmarks</a>&nbsp;is an interactive dashboard that lets you explore and compare web performance data for leading websites across several industries &ndash; from retail to media.</strong></p> <p dir="ltr">With Page Speed Benchmarks, you can do things like:</p> <ul> <li dir="ltr" role="presentation">See what the different metrics actually mean in terms of user-perceived performance</li> <li dir="ltr" role="presentation">Compare how the same page renders on fast vs slow devices and connections</li> <li dir="ltr" role="presentation">Understand what makes fast sites fast (and slow sites slow)</li> <li dir="ltr" role="presentation">Get insights into how third parties can perform on different sites</li> <li dir="ltr" role="presentation">Identify sites you can use for your own competitive benchmarking</li> </ul> <p dir="ltr">If you already like tools like the <a href="https://httparchive.org/" target="_blank" rel="noopener">HTTP Archive</a>, I think you'll love how you can use <a href="/benchmarks/" target="_blank" rel="noopener">Page Speed Benchmarks</a> to complement the insights you're already getting. Keep reading to find out how we set up these benchmarks, and how you can mine our test data &ndash; <strong>even if you're not a SpeedCurve user</strong> &ndash; for your own performance research.</p><h2 dir="ltr">Interactive, ongoing, and public&nbsp;</h2> <p dir="ltr">Over the past ten years or so, I&rsquo;ve put a lot of time into researching industry benchmarks for web performance. <strong>What makes me especially excited about <a href="/benchmarks/" target="_blank" rel="noopener">Page Speed Benchmarks</a> is that all our data is interactive, ongoing, and publicly available.</strong>&nbsp;</p> <p dir="ltr">This means you have access to the same data that we do. You don&rsquo;t have to wait for us to release monthly reports. And you don&rsquo;t need to have a SpeedCurve account or any sort of login to start exploring our test results and mining for meaningful data you can use in your own projects. How awesome is that?!</p> <h2 dir="ltr">How we set up our testing</h2> <ul> <li dir="ltr" role="presentation">Home pages of 10 leading sites in the US and the EU, in each of the following industries: Auto, Finance, Media, Retail, Tech, and Travel. (We&rsquo;ll add more later, but we felt like this was a solid start.)</li> <li dir="ltr" role="presentation">Tested on our private agents in Frankfurt (for the EU sites) and US East Coast (for the US sites).&nbsp;</li> <li dir="ltr" role="presentation">Tested once per day on a Chrome desktop browser with a fast connection (25Mbps/10Mbps 10ms RTT).&nbsp;</li> <li dir="ltr" role="presentation">Tested once per day on an emulated Nexus 5X mobile at 3G Slow (400Kbps/400Kbps 400ms RTT). Find out more about <a href="https://timkadlec.com/remembers/2019-01-09-the-ethics-of-performance/">why it's so important to test at slow speeds.</a>&nbsp;</li> <li dir="ltr" role="presentation">Three tests per test time, with the medians used in the charts.</li> </ul> <h2 dir="ltr">What you can do with these benchmarks:</h2> <h3 dir="ltr">1. Learn what the different metrics mean in terms of user-perceived performance.&nbsp;</h3> <p dir="ltr">You can use the dropdowns at the top of the <a href="/benchmarks/" target="_blank" rel="noopener">Page Speed Benchmarks dashboard</a> to explore some of the metrics we're tracking. If you want to get more insight, click the "Explore this site" link below each chart to see the test results for any of the sites. There you&rsquo;ll see a waterfall chart alongside a filmstrip view that shows how the page renders, like this one:</p> <p dir="ltr"><a href="/benchmark/media-eu/test/200210_3D_45673c951f15c5054ef63f2a2e44956e/?share=freljsuj6913s9s5an29pktz92alec" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/filmstrip-waterfall.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr"><br />We focus on these metrics in <a href="/benchmarks/" target="_blank" rel="noopener">the main Benchmarks dashboard</a>, and from there you can drill down into the individual test results to see many more:</p> <ul> <li dir="ltr" role="presentation"><strong>Backend</strong> &ndash; The first byte of the base HTML is received by the browser (AKA Time to First Byte)</li> <li dir="ltr" role="presentation"><strong>Start Render</strong> &ndash; The first non-white content is painted in the browser</li> <li dir="ltr" role="presentation"><strong>SpeedIndex</strong> &ndash; The average time at which visible parts of the page are displayed</li> <li dir="ltr" role="presentation"><strong>Largest Contentful Paint</strong> &ndash; The largest element &ndash; usually image or video &ndash; in the viewport is rendered</li> <li dir="ltr" role="presentation"><strong>First CPU Idle</strong> &ndash; The page is minimally interactive (most UI elements are interactive, page responds to most user input reasonably quickly)</li> <li dir="ltr" role="presentation"><strong>Time to Interactive</strong> &ndash; The page becomes interactive (displays useful content, UI elements are interactive, page responds to user interactions within 50ms)</li> <li dir="ltr" role="presentation"><strong>Visually Complete</strong> &ndash; All content in the viewport has rendered, and nothing in the viewport changes as the rest of the page loads</li> <li dir="ltr" role="presentation"><strong>Fully Loaded</strong> &ndash; The page has completely loaded with no network activity for 2 seconds<br /><br /></li> </ul> <h3 dir="ltr">2. Appreciate the difference between fast vs slow.</h3> <p dir="ltr">It&rsquo;s inspiring to see how fast a page can be under the right conditions. And it&rsquo;s eye-opening to see how that same page can suffer on low-CPU devices and slow connections. (Tim Kadlec gives a strong argument for why you should test on slower connections in <a href="https://timkadlec.com/remembers/2019-01-09-the-ethics-of-performance/" target="_blank" rel="noopener">this excellent post</a>.)</p> <h3 dir="ltr">3. Understand what makes fast sites fast (and slow sites slow).&nbsp;</h3> <p dir="ltr">Drill down into the waterfalls for each page to see exactly what separates the fast sites from the slow ones.&nbsp;&nbsp;</p> <h3 dir="ltr">4. Get some insights into how third parties can perform on different sites.</h3> <p dir="ltr">This is one of my favourite aspects of this research. More on this to come!</p> <h3 dir="ltr">5. Find sites you can include with your own benchmarking</h3> <p dir="ltr">Don&rsquo;t think of this as "competitive benchmarking" as much as it is &ldquo;aspirational benchmarking&rdquo;. Looking at the historical data for each site will give you an idea as to which sites you can benchmark in your own testing. <strong>#perfgoals</strong></p> <h2 dir="ltr">What we DON'T want you to do with these benchmarks:</h2> <h3 dir="ltr">1. Don&rsquo;t confuse these findings with real user data and experiences.&nbsp;</h3> <p dir="ltr">These tests are snapshots, based on synthetic tests, with all the <a href="https://support.speedcurve.com/en/articles/74068-synthetic-vs-real-user-monitoring-rum">caveats</a> that this entails.&nbsp;</p> <h3 dir="ltr">2. Don&rsquo;t use these results as leaderboards.&nbsp;</h3> <p dir="ltr"><a href="/benchmarks/">Page Speed Benchmarks</a> isn&rsquo;t a contest or a set of "top ten" lists. These aren&rsquo;t the fastest or slowest sites on the web. They&rsquo;re simply a set of sites we&rsquo;ve chosen to track over time. We&rsquo;re more interested in digging into the test results to see what we can learn about what makes fast sites fast and slow sites slow.&nbsp;</p> <h3 dir="ltr">3. Don&rsquo;t name and shame.&nbsp;</h3> <p dir="ltr">Every site has bad hair days. For example, highly dynamic sites, such as media sites, serve different third parties throughout the day. A slow start render time could be caused by a single script that our synthetic test happened to capture. Or it could be caused by a temporary backend issue. You get the idea.</p> <h2 dir="ltr">Now let&rsquo;s look around&hellip;</h2> <p dir="ltr"><a href="/benchmarks/usa/media/fast/start-render/" target="_blank" rel="noopener">Let&rsquo;s start by looking at the results for US media sites on a fast desktop connection.</a> This is an interesting group to start with because these sites face some aggressive performance challenges:</p> <ul> <li dir="ltr" role="presentation">Pages tend to have a lot of content, including heavy images and video.&nbsp;</li> <li>Content is consumed on mobile devices, often over spotty connections.</li> <li>Media sites are under tremendous pressure to generate ad revenue, so we see a lot of third-party ad services.&nbsp;</li> <li dir="ltr" role="presentation">Teams at media organizations are tasked to collect a huge amount of user data, so we see a lot of tracking and analytics tags.&nbsp;</li> </ul> <p dir="ltr">All of the above traits are even more pronounced in the US than in the EU, which is what makes this industry compelling to track if you care about performance.</p> <h3 dir="ltr">Which metrics correlate with user-perceived performance?</h3> <p dir="ltr">In previous posts (<a href="/blog/rendering-metrics/">here</a> and <a href="/blog/an-analysis-of-chromiums-paint-timing-metrics/">here</a>, for example), we&rsquo;ve strongly advocated validating your metrics by looking at filmstrip views of your pages rendering. It may challenge some of your assumptions about the relevance of some metrics as proxies for user experience.&nbsp;</p> <p dir="ltr">With <a href="/benchmarks/" target="_blank" rel="noopener">Page Speed Benchmarks</a>, we can sort sites by how they rank across popular metrics. The highlighted frames in the filmstrips show when each metric is measured. So let&rsquo;s do that now, looking at a trio of metrics that often are conflated with user-perceived performance: Start Render, Speed Index, and Visually Complete. (Here's a helpful <a href="https://support.speedcurve.com/en/articles/74078-what-do-the-different-speedcurve-metrics-represent">glossary</a> of common web performance metrics.)</p> <h4 dir="ltr">Start Render (first non-white content is painted in the browser)</h4> <p dir="ltr"><a href="/benchmarks/usa/media/fast/start-render/">This sorting</a> stacks up pretty neatly from fastest to slowest. This isn&rsquo;t a huge surprise, which is why it&rsquo;s a good idea for you to consider including start render as a metric to track.&nbsp;&nbsp;</p> <p dir="ltr"><a href="/benchmarks/usa/media/fast/start-render/"><img class="blog-img" src="https://img.speedcurve.com/blog/NEW-UX-start-render.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h4 dir="ltr">Speed Index (average time at which visible parts of the page are displayed)</h4> <p dir="ltr"><a href="/benchmarks/usa/media/fast/speedindex/">This sorting</a> isn't quite as consistent as start render, but with the exception of USA Today at the bottom, seems mostly valid.</p> <p dir="ltr"><a href="/benchmarks/usa/media/fast/speedindex/"><img class="blog-img" src="https://img.speedcurve.com/blog/NEW-UX-speedindex.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h4 dir="ltr">Visually Complete (all content in the viewport has rendered, and nothing in the viewport changes)</h4> <p dir="ltr">For this set of sites, <a href="/benchmarks/usa/media/fast/visually-complete/">visually complete</a> is all over the map. For half the sites, it doesn't fire until after 5.5 seconds, which is why we're not seeing it in this screenshot.&nbsp;</p> <p dir="ltr"><a href="/benchmarks/usa/media/fast/visually-complete/"><img class="blog-img" src="https://img.speedcurve.com/blog/NEW-UX-visually-complete.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h4 dir="ltr">Takeaway: Test, validate, then test some more</h4> <p dir="ltr">The purpose of doing this investigation wasn&rsquo;t to criticize any of these metrics, but rather to make it clear that metrics that are relevant for some pages won&rsquo;t necessarily be relevant for others. At the risk of sounding like a broken record, you really need to look at your own data and your own filmstrips to make sure you&rsquo;re picking the right metrics to focus on for your site.</p> <p dir="ltr">Now let&rsquo;s look a bit closer at <a href="/benchmarks/europe/media/fast/start-render/" target="_blank" rel="noopener">this same set of US media sites</a> and see what we can learn by drilling down into the test results...</p> <h3 dir="ltr">Not surprisingly, all sites are fast on a fast desktop connection.&nbsp;</h3> <p dir="ltr">At the time of writing this post, all ten sites started rendering in less than 3 seconds, and six sites had a start render of 1 second or less. No surprises here.</p> <p dir="ltr"><a href="/benchmarks/usa/media/fast/start-render/"><img class="blog-img" src="https://img.speedcurve.com/blog/NEW-UX-start-render.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h3 dir="ltr">And no surprise, all sites are slow on a slow mobile connection.</h3> <p dir="ltr"><a href="/benchmarks/usa/media/slow/start-render/" target="_blank" rel="noopener">Now let&rsquo;s take a look at how the same ten sites rendered on a slow mobile connection.</a> (Remember: This is an emulated Nexus 5X mobile on a slow 3G connection.)&nbsp;The fastest site didn&rsquo;t start to render till around 7 seconds, and the slowest start render was at 36 seconds.</p> <p dir="ltr"><a href="/benchmarks/usa/media/slow/start-render/" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/NEW-media-slow-mobile-start-render.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">Now that we've gotten the obvious observations out of the way, let's ask some meatier questions...</p> <h3 dir="ltr">Page bloat is real. But does it always matter?</h3> <p dir="ltr">As someone who&rsquo;s somewhat obsessed (okay, very obsessed) with <a href="/blog/web-performance-page-bloat/">page bloat</a>, I find it interesting to click through to look at the detailed benchmarks, so let&rsquo;s do that for the <a href="/benchmark/media-us/benchmark/?b=desktop&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;l=home&amp;m=render&amp;r=us-east-1&amp;share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener">fast desktop group</a>.&nbsp;</p> <p dir="ltr"><a href="/benchmark/media-us/benchmark/?b=desktop&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;l=home&amp;m=render&amp;r=us-east-1&amp;share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/page-size-all.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr"><br />While a couple of pages fall below the <a href="https://almanac.httparchive.org/en/2019/page-weight" target="_blank" rel="noopener">HTTP Archive median size of 1900KB</a>, the rest are larger &ndash; with two pages topping out in the 6-8MB range. (As someone who&rsquo;s also obsessed with data usage &ndash; I spend a lot of time reading articles while I'm out roaming the world &ndash; this is a reminder that I need to be extra mindful of my news consumption when I&rsquo;m out and about.)</p> <p dir="ltr">If you&rsquo;re anything like me, you&rsquo;re extremely curious about those spikes, so <a href="/benchmark/media-us/test/200122_6A_b96d96c24be338ca8b72b07580169b1f/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener">let&rsquo;s take a closer look</a>. To do that, all you need to do is click on any test point in a time series, and then click the "View Test" link:</p> <p dir="ltr"><a href="/benchmark/media-us/test/200122_6A_b96d96c24be338ca8b72b07580169b1f/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/view-test-NYT.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">This takes us to a&nbsp;<a href="/benchmark/media-us/test/200122_6A_b96d96c24be338ca8b72b07580169b1f/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener">detailed test result</a> for The New York Times, where we can see how popular rendering metrics align with the filmstrip. What&rsquo;s great to see here is that, despite the total size of this page, the filmstrip view shows that it actually renders pretty quickly &ndash; yay!&nbsp;&nbsp;</p> <p dir="ltr"><a href="/benchmark/media-us/test/200122_6A_b96d96c24be338ca8b72b07580169b1f/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/NYT-waterfall.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">When we scroll down the test results to see the breakdown of resources on the page, you can see that a lot of the weight can be attributed to JavaScript and images &ndash; and, notably, 8MB worth of video content.</p> <p dir="ltr"><a href="/benchmark/media-us/test/200122_6A_b96d96c24be338ca8b72b07580169b1f/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/NYT-desktop-page-size.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">So let&rsquo;s look into the&nbsp;<a href="/benchmark/media-us/test/200122_X9_799387ba08d8fd01d314b467fca8a0c1/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener">mobile test results</a> for The New York Times to see what they were serving mobile devices at the same date and time:&nbsp;</p> <p dir="ltr"><a href="/benchmark/media-us/test/200122_X9_799387ba08d8fd01d314b467fca8a0c1/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/NYT-mobile-waterfall.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">As you can see above, the page doesn&rsquo;t start rendering until more than 5 seconds have passed. It&rsquo;s not ideal, but it&rsquo;s not terrible &ndash; again, keeping in mind this is on a slow 3G connection.</p> <p dir="ltr">Next, let&rsquo;s open up the waterfall to see what&rsquo;s happening before the page starts to render:</p> <p dir="ltr"><a href="/benchmark/media-us/test/200122_X9_799387ba08d8fd01d314b467fca8a0c1/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/mobile-NYT-waterfall.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">In these charts, the blue bars represent HTML, so there&rsquo;s roughly 4.5 seconds of downloading and parsing there alone. The green hashed bars represent blocking CSS. These assets have download/parse durations ranging from roughly 500 milliseconds to 2.5 seconds. So there you go. No big mystery here &ndash; just a reminder to optimize/reduce your CSS whenever you can.&nbsp;&nbsp;</p> <p dir="ltr">We came here to look at page weight, so let&rsquo;s do that. On the plus side, The New York Times is serving a much lighter version of its home page to mobile, partly thanks to the fact that it&rsquo;s not serving video content. This is great to see:</p> <p dir="ltr"><a href="/benchmark/media-us/test/200122_X9_799387ba08d8fd01d314b467fca8a0c1/?share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/NYT-mobile-page-size.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">The not-so-good news is that the page is still over 4MB in size, with around 3MB of that coming from JavaScript alone. I&rsquo;m pretty surprised to see that, as I really expected the bulk of the weight to come from images. Image weight comes in at 163KB, which is good by any standard.&nbsp;</p> <p dir="ltr">JavaScript is clearly an issue here, so for a bit more fun, we can head over to the&nbsp;<a href="/benchmark/media-us/javascript/?b=desktop&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;r=us-east-1&amp;s=154520&amp;u=210267&amp;share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener">JavaScript dashboard</a> (also available via the left-hand navbar).&nbsp;Below you can see a waterfall that focuses solely on JS. (Note that this chart was generated at the time of writing this post. We always shoe you the latest waterfall on the JS dashboard, so what you see when you visit the dashboard will probably look different than what you see here.)</p> <p dir="ltr"><a href="/benchmark/media-us/javascript/?b=desktop&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;r=us-east-1&amp;s=154520&amp;u=210267&amp;share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/NYT-JS-dashboard.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p dir="ltr">Clearly there&rsquo;s a lot of JavaScript on this page, but really what we care about is the impact of all that JS on user experience. To help do that, we show you all the scripts that take more than 50ms to execute:</p> <p dir="ltr"><a href="/benchmark/media-us/javascript/?b=desktop&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;r=us-east-1&amp;s=154520&amp;u=210267&amp;share=5o1gzxgw7797gujjwwgn9i1kffs4g1" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/NYT-long-tasks.gif?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a><br />These are Long Tasks &ndash;&nbsp;browser events that block the CPU for more than 50ms.&nbsp;<a href="/blog/measuring-jank-and-ux/">Long Tasks make pages feel janky.</a>&nbsp;&nbsp;The more Long Tasks there are on a page, the greater the likelihood that the page will hurt user experience.</p> <p dir="ltr">Again, keep in mind that these results are for a slow mobile connection &ndash; but users on slow mobile connections matter! Remember that people&rsquo;s devices and connections vary throughout the day. Someone who visits your site on a fast desktop connection when they&rsquo;re at work could also very well come back when they&rsquo;re riding the train home from work, using spotty 3G on their phone. Inconsistent performance is frustrating!</p> <p dir="ltr">We&rsquo;re veering toward the topic of <a href="/blog/third-party-blame-game/">third-party performance</a>, which is HUGE and merits a separate post of its own, so I&rsquo;m going to stop here for today. I&rsquo;m already planning another dive into this data, where I&rsquo;ll focus exclusively on third parties. And of course, you&rsquo;re welcome to go ahead and get started without me. :)</p> <h2 dir="ltr">Start exploring!</h2> <p dir="ltr">What we&rsquo;ve covered today is truly just the tip of the iceberg. I strongly encourage you to head to <a href="/benchmarks/" target="_blank" rel="noopener"><strong>Page Speed Benchmarks</strong></a> and do your own investigation. If you find anything interesting, let me know! And if you have any suggestions or feedback about the benchmarks, I'd love to hear that, too.</p> Tue, 11 Feb 2020 00:00:00 +1300 Six web performance resolutions for the new year https://speedcurve.com/blog/web-performance-resolutions <p><img class="blog-img" src="https://img.speedcurve.com/blog/2020-cropped.jpg?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>For the past two years, the&nbsp;<a href="https://perfnow.nl/" data-url="https://perfnow.nl/" data-id="entity-ember2902">performance.now()</a>&nbsp;conference has been the most valuable performance event I've attended. So valuable, in fact, that I've made some of the talks the cornerstone of this list of performance resolutions for 2020. I'd love to know how many &ndash; if any &ndash; of these are on your list. As always, I'd love people's feedback!</p><h2>1. Connect the impact of web performance to your business</h2> <p data-id="block-ember2907" data-generated-at="15784417176990.9999033770466623" data-align="left">Harry Roberts&nbsp;did an eye-opening talk called&nbsp;<a href="https://youtu.be/cXLOIIJ1UaE">From Milliseconds to Millions</a>, in which he shared practical wisdom gleaned from his experience as a performance consultant for some of the biggest sites in the world. There's a ton of useful material and inspiring case studies in here, including some really great examples of using correlation charts to see the relationship between performance and conversions.&nbsp;</p> <p data-id="block-ember2911" data-generated-at="15784417177000.4675620893142791" data-align="left">Harry also shared how to use real user monitoring as part of an A/B test to measure the impact of a single third-party script on bounce rate:</p> <p data-id="block-ember2911" data-generated-at="15784417177000.4675620893142791" data-align="left"><code><img class="blog-img" src="https://img.speedcurve.com/blog/business.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></code></p> <p data-id="block-ember2911" data-generated-at="15784417177000.4675620893142791" data-align="left"><code></code>To run your own A/B tests and create your own correlation charts&nbsp;in LUX, our RUM tool, here are some resources you'll find helpful:</p> <ul data-id="block-ember2915" data-generated-at="15784417177000.8262634605368946"> <li data-id="block-ember2916" data-generated-at="15784417177000.4335731856407947"><a href="https://support.speedcurve.com/en/articles/1262334-lux-customer-data" data-url="https://support.speedcurve.com/en/articles/1262334-lux-customer-data" data-id="entity-ember2917">Add customer data, such as cart size, conversion rate, and A/B test data</a></li> <li data-id="block-ember2918" data-generated-at="15784417177000.7421540024319513"><a href="https://support.speedcurve.com/en/articles/2941528-tracking-conversion-rates-in-speedcurve" data-url="https://support.speedcurve.com/en/articles/2941528-tracking-conversion-rates-in-speedcurve" data-id="entity-ember2919">Track conversion rates</a></li> </ul> <h2 data-id="block-ember2911" data-generated-at="15784417177000.4675620893142791" data-align="left">2. Help other people in your organization care about performance</h2> <p data-id="block-ember2921" data-generated-at="15784417177010.5954964558899394" data-align="left">In my role here at SpeedCurve, I've talked with hundreds of our customers about how they do performance. One thing the most successful teams agree on: having a strong culture of web performance is a huge success factor.&nbsp;</p> <p data-id="block-ember2921" data-generated-at="15784417177010.5954964558899394" data-align="left"><img class="blog-img" src="https://img.speedcurve.com/blog/culture.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p data-id="block-ember2923" data-generated-at="15784417177010.48719656313597204" data-align="left">In my talk,&nbsp;<a href="https://youtu.be/SE0HhF4TO0Q">The 7 Habits of Highly Effective Performance Teams</a>, I shared some tips and best practices that demonstrate how a strong culture of performance can help you:</p> <ul data-id="block-ember2926" data-generated-at="15784417177010.3374701974175025"> <li data-id="block-ember2927" data-generated-at="15784417177010.8469437295821294">Prevent regression</li> <li data-id="block-ember2928" data-generated-at="15784417177010.11704046431104431">Reduce gatekeeping</li> <li data-id="block-ember2929" data-generated-at="15784417177010.5745817824221786">Increase investment from the business</li> </ul> <p>MORE:&nbsp;<a href="https://support.speedcurve.com/en/articles/1548003-performance-culture-tips-and-best-practices" data-url="https://support.speedcurve.com/en/articles/1548003-performance-culture-tips-and-best-practices" data-id="entity-ember2931">Performance culture tips and best practices</a></p> <h2>3. Find out how happy your users are</h2> <p data-id="block-ember2934" data-generated-at="15784417177020.013794236703909224" data-align="left">How do we know if users are happy? As members of the web performance community, we&rsquo;ve been thinking about the best ways to answer that question for years. Now the observability community is asking the same questions, but coming at them from the opposite side of the stack.&nbsp;</p> <p data-id="block-ember2935" data-generated-at="15784417177020.9757961643251716" data-align="left">In her talk <a href="https://youtu.be/omftVj-SFAU">Observability is for User Happiness</a>,&nbsp;Emily Nakashima&nbsp;talked about how approaching web performance through the lens of observability has changed the way her team thinks about performance instrumentation and optimization.&nbsp;</p> <p data-id="block-ember2935" data-generated-at="15784417177020.9757961643251716" data-align="left"><img class="blog-img" src="https://img.speedcurve.com/blog/happiness.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" />​</p> <p data-id="block-ember2940" data-generated-at="15784417177030.17739274304837704" data-align="left">Among other things, Emily talked about how performance budgets and SLOs can help you stay accountable.&nbsp;<a href="https://support.speedcurve.com/en/articles/1539827-create-performance-budgets-and-set-alerts" data-url="https://support.speedcurve.com/en/articles/1539827-create-performance-budgets-and-set-alerts" data-id="entity-ember2941">Here's how you can use SpeedCurve to set performance budgets and alerts.</a></p> <h2 data-id="block-ember2940" data-generated-at="15784417177030.17739274304837704" data-align="left">4. Get to the bottom of third-party performance</h2> <p data-id="block-ember2961" data-generated-at="15784417177040.5362885886315691" data-align="left">In his talk <a href="https://youtu.be/uXv9JFvrnwo">Deep Dive into Third-Party Performance</a>,&nbsp;Simon Hearne&nbsp;covered which third-party tags have the greatest impact on user experience, how ad blockers affect site speed, and what to look out for when evaluating a new third-party service. He also shared valuable techniques to manage third-party performance and security without creating friction with your marketing and analytics teams.</p> <p data-id="block-ember2961" data-generated-at="15784417177040.5362885886315691" data-align="left"><img class="blog-img" src="https://img.speedcurve.com/blog/third-party.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p data-id="block-ember2966" data-generated-at="15784417177040.7544421546462696" data-align="left">Your SpeedCurve&nbsp;<a href="/blog/third-party-blame-game/" data-url="https://speedcurve.com/blog/third-party-blame-game/" data-id="entity-ember2968">third-party dashboard</a>&nbsp;gives you the ability to&nbsp;<a href="https://support.speedcurve.com/en/articles/74059-track-a-third-party" data-url="https://support.speedcurve.com/en/articles/74059-track-a-third-party" data-id="entity-ember2971">monitor individual third parties over time</a>, and create performance budgets for them.</p> <h2 data-id="block-ember2966" data-generated-at="15784417177040.7544421546462696" data-align="left">5. Reduce the JavaScript on your pages... and keep it off</h2> <p data-id="block-ember2944" data-generated-at="15784417177030.1670197653234593" data-align="left">JavaScript is, byte-for-byte, the most expensive resource on the web and we&rsquo;re using more of it than ever in our sites. In his talk <a href="https://youtu.be/JvJ0v5OohNg">When JavaScript Bytes</a>,&nbsp;Tim Kadlec&nbsp;shared practical ways to reduce the amount of JS you're sending your users, as well as tools and approaches to make sure those bytes stay off.</p> <p data-id="block-ember2944" data-generated-at="15784417177030.1670197653234593" data-align="left"><img class="blog-img" src="https://img.speedcurve.com/blog/javascript.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p data-id="block-ember2949" data-generated-at="15784417177030.5123637577081108" data-align="left">Here's how SpeedCurve can help you manage your JavaScript:</p> <ul data-id="block-ember2951" data-generated-at="15784417177030.15109035183155806"> <li data-id="block-ember2952" data-generated-at="15784417177030.6772118848058337"><a href="https://support.speedcurve.com/en/articles/2427384-monitoring-javascript-performance" data-url="https://support.speedcurve.com/en/articles/2427384-monitoring-javascript-performance" data-id="entity-ember2953">Monitor JavaScript performance</a></li> <li data-id="block-ember2954" data-generated-at="15784417177030.10459608641135931"><a href="/blog/measuring-jank-and-ux/" data-url="https://speedcurve.com/blog/measuring-jank-and-ux/" data-id="entity-ember2955">Measure jank and UX</a></li> <li data-id="block-ember2956" data-generated-at="15784417177040.5451648515094867"><a href="/blog/new-lux-javascript-dashboards/" data-url="https://speedcurve.com/blog/new-lux-javascript-dashboards/" data-id="entity-ember2957">Use the LUX JS dashboard to measure Long Tasks and CPU times</a></li> <li data-id="block-ember2958" data-generated-at="15784417177040.6924214512326017"><a href="/blog/new-lux-javascript-dashboards/" data-url="https://speedcurve.com/blog/new-lux-javascript-dashboards/" data-id="entity-ember2959">Track JS errors</a></li> </ul> <h2>6. Understand the latest performance metrics</h2> <p data-id="block-ember2974" data-generated-at="15784417177050.4431586627379016" data-align="left">We're obsessed with finding metrics that best represent the user experience. Largest Contentful Paint is one of the newest UX-oriented metrics on the landscape, and it looks promising. LCP measures when the largest element (usually an image or video) renders in the viewport.&nbsp;</p> <p data-id="block-ember2975" data-generated-at="15784417177050.4895919495108758" data-align="left">Largest Contentful Paint is currently only available in Chrome, so it was fascinating to learn directly from&nbsp;Annie Sullivan, a member of the Chrome team, how they develop and test new metrics like LCP. Annie's talk,&nbsp;<a href="https://youtu.be/ctavZT87syI">Lessons Learned from Performance Monitoring in Chrome</a>,&nbsp;is a must-watch if you're interesting in learning about the life cycle of metrics and the rigour with which new metrics are developed and tested.</p> <p data-id="block-ember2975" data-generated-at="15784417177050.4895919495108758" data-align="left"><img class="blog-img" src="https://img.speedcurve.com/blog/metrics.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p data-id="block-ember2980" data-generated-at="15784417177060.1344895035776308" data-align="left">Here's how you can track Largest Contentful Paint using SpeedCurve:</p> <ul data-id="block-ember2982" data-generated-at="15784417177060.40334399223310147"> <li data-id="block-ember2983" data-generated-at="15784417177060.20174890315974148"><a href="https://support.speedcurve.com/en/articles/1539827-create-performance-budgets-and-set-alerts" data-url="https://support.speedcurve.com/en/articles/1539827-create-performance-budgets-and-set-alerts" data-id="entity-ember2984">Create performance budgets</a>&nbsp;for LCP in both LUX and Synthetic</li> <li data-id="block-ember2985" data-generated-at="15784417177060.7801218718857892">SpeedCurve's&nbsp;<a href="https://support.speedcurve.com/en/articles/3380780-user-happiness" data-url="https://support.speedcurve.com/en/articles/3380780-user-happiness" data-id="entity-ember2986">User Happiness metric</a>&nbsp;(available in LUX) is an aggregate metric that includes Largest Contentful Paint</li> </ul> <p>And here's our <a href="https://support.speedcurve.com/en/articles/74078-what-do-the-different-speedcurve-metrics-represent">glossary of commonly used performance metrics</a>.&nbsp;</p> <h2>What are your performance resolutions?</h2> <p>Do you have questions about anything I've mentioned here? Are you focusing on anything I haven't talked about? Let me know in the comments, or <a href="https://twitter.com/tameverts">reach me on Twitter</a>!</p> Wed, 08 Jan 2020 00:00:00 +1300 Sampling RUM: When and why it's a good idea https://speedcurve.com/blog/sampling-real-user-monitoring <p><img class="blog-img" src="https://img.speedcurve.com/blog/sampling-RUM.jpg?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>I confess, I&rsquo;m not a statistician. While I pride myself on the 'A' I received in my college statistics class, admittedly it was on a pretty steep curve. That said, I&rsquo;ve been looking at performance data for many years and have found myself on both sides of the debate about whether or not the practice of sampling performance data is inherently a good or bad idea.&nbsp;</p> <p>When it comes to real user monitoring (RUM), I&rsquo;m convinced that the marginal cost of collection, computation, storage, etc. is not always great enough to warrant a practice of collecting ALL THE THINGS by default.</p> <p>Like any experiment, how you sample RUM data &ndash; as well as how much data to sample &ndash; depends on the answers you seek. While certainly not an exhaustive list, here are some questions you might ask when looking at implementing a sampled approach to real user monitoring...</p><h2>Are sessions important to you?</h2> <p>At SpeedCurve, we&rsquo;re big fans of not only looking at individual page performance, but also looking at performance in the context of a user&rsquo;s entire visit to the site. This helps us do things like:</p> <ul> <li>correlate various performance metrics with user behavior,&nbsp;</li> <li>understand the user journey and popular pages so you can better model your synthetic testing, and&nbsp;</li> <li>identify bottlenecks impacting a site&rsquo;s business goals.&nbsp;</li> </ul> <p>However, some teams we've worked with want the option to look at individual pages in isolation if they are part of a product team just focused on one area. That&rsquo;s fine, too!</p> <p>A lot of performance users really love that they can track business metrics specific to a session alongside their performance data. While real user monitoring tools aren&rsquo;t typically looked at as a replacement for marketing analytics tools, having session metrics available with your performance data is pretty great for anyone who cares about performance. This way you can easily base your performance budgets on a business outcome, such as a cart conversion or a click on a &ldquo;call to action&rdquo; link.</p> <p>In the case where sessions are important to you, finding a RUM solution (or creating one) that does session-based sampling is key. This does mean that the size of your sample for page views will likely not be exact. At SpeedCurve, we&rsquo;re good with that and prefer to maintain the integrity of the session vs. sample too aggressively and break them up to stay within a strict page view budget.&nbsp;</p> <h2>Where should you do the sampling?</h2> <p>Another big thing to think about when applying sampling is <strong>where</strong> you want to sample. Having the ability to sample at the collection point as well as in the client/browser itself provides you with a lot of flexibility. <a href="https://support.speedcurve.com/en/articles/2562938-setting-your-lux-sample-rate">We offer both options at SpeedCurve</a>, but sometimes people aren&rsquo;t sure which to go with.</p> <p>In most cases, sampling from the collection endpoint (either through a vendor, your CDN or your origin) gets the job done and is a fine approach. However, for some more sophisticated users who want to be very sensitive to how they are spending their &ldquo;beacon budget&rdquo;, you may elect to sample at the client. This allows you to do things like increase the sample rate for an A/B test group for comparison with a control group when the test group is extremely small. Potentially you want to sample based on the location of the user agent, the type of user agent, or even the type of user you are serving content to.</p> <p><strong>One thing to be careful of: If you do manipulate your sampling to collect more data for specific segments, make sure you are able to exclude these segments appropriately or keep them completely separate when drawing conclusions about the entire population of your users.</strong> One great way to do this is to create a separate flag for these groups that you can use to isolate from your greater population. SpeedCurve allows for adding Customer Data using our <a href="https://support.speedcurve.com/en/articles/1262334-lux-customer-data">LUX.addData API</a>.</p> <p>Having this flexibility is really great, and helps you make sure you are getting the most out of your monitoring budget.</p> <h2>Considerations for determining your sample size</h2> <h3>How distributed is your traffic?</h3> <p>We&rsquo;ve heard great accounts of customers who assume their traffic is 100% regional, only to find they have an entire contingent of users in another country! (<a href="https://youtu.be/cXLOIIJ1UaE">Watch this great talk from Harry Roberts at performance.now()</a> to hear such a tale. It&rsquo;s at minute 10:45, but the entire talk is fantastic, so make sure to watch the whole thing!)</p> <p>For most sites, they want to understand where their users are. If sampled too heavily, the dataset for these important cohorts of users is often too small to get relevant insight. That said, when you have to make decisions about where to spend your monitoring budget, drawing insights from your primary geographic region in isolation may be warranted.</p> <h3>Are you running experiments in production?</h3> <p>This is a rapidly growing practice that is becoming more and more important for product teams. Whether you&rsquo;re pushing canary builds or running A/B test variants, you want to ensure that you have enough data in those buckets to factor performance into the decision criteria. We&rsquo;ve seen sites make business decisions based on performance data that was so inconclusive that it would have been better if it had been ignored.&nbsp;</p> <h3>Are you only interested in a specific type of traffic?</h3> <p>Most organizations want to understand how their site is performing across multiple form factors (desktop/tablet/mobile) as well as browser types. Oftentimes an important subset of users using a technology may represent a significantly smaller user base. Given the massive fragmentation of mobile devices &ndash;namely Android &ndash; understanding performance is crucial to creating a more inclusive web. Ensuring a proper sample size for these cohorts is crucial and often hard to do if you aren&rsquo;t paying attention. That said, for some teams the focus may be more specifically targeted toward a certain technology or user agent, so a smaller sample for a more popular user agent or device may work just fine.</p> <h3>Do you have a relatively small population of REALLY important users?</h3> <p>Whether you're a retail site, financial services, media or other, you likely have a smaller set of users that you are VERY interested in. Getting an adequate dataset for a retailer when the rate of conversion is really low (say 1-2%) may be really hard to do if your sample size is too small. Similarly, media sites care a lot about registered users on the other side of a metered paywall, but most likely they make up a MUCH smaller segment of the population. These examples exist across all of our sites, and it&rsquo;s important that we have the ability to represent them in our datasets.</p> <h2>The important thing is to get started</h2> <p>Whether you are considering getting started with RUM or changing the approach you use today, don&rsquo;t let the decision of how much to sample send you into paralysis. We always advise customers who are unsure to start small, see what you can learn and continue to expand as necessary.&nbsp;</p> <p>I hope this is helpful and encourage you to check out some of these support articles below or reach out if you have questions. Otherwise, I highly encourage you to <a href="/setup/trial/">get started with a free trial of LUX</a> today!</p> <p>More:</p> <ul> <li><a href="/features/lux/#overview">Overview of LUX, our RUM product</a></li> <li><a href="https://support.speedcurve.com/en/articles/1266080-get-started-with-lux-real-user-monitoring">Quick Start Guide for LUX</a></li> <li><a href="https://support.speedcurve.com/en/articles/1244217-how-many-rum-page-views-do-i-need">How many RUM pageviews do I need?</a></li> <li><a href="https://support.speedcurve.com/en/articles/2562938-setting-your-lux-sample-rate">How to set your LUX sample rate</a></li> </ul> Mon, 16 Dec 2019 00:00:00 +1300 A long time coming... https://speedcurve.com/blog/long-time-coming <p>I&rsquo;ve joined SpeedCurve! I&rsquo;m thrilled to share this news and have never been more excited about a career change than I am today. I&rsquo;ve known this cast of characters for a while and am humbled that they have brought me onto the team. <a href="/blog/tammy-everts-has-joined-speedcurve/">As Tammy put it</a> when she joined, if this crew invited you to work with them, &ldquo;what would you say?&rdquo;&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Cliff-Steve-Tammy-2015.jpg?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p style="text-align: center;"><strong>Tammy, Steve and Cliff at Velocity Conference circa 2015</strong></p> <h2>Who am I?</h2> <p>As a veteran in the performance industry, I&rsquo;ve spent a large part of my career helping to build performance culture. I&rsquo;ve been in countless rooms and discussions defending the case for performance and helping to educate cross-functional teams about the impact of performance on the user experience and ultimately the health of the business.&nbsp;</p> <p>My journey has taken me to both sides &ndash; as a product leader focused on building tools and solutions for customers, and as a practitioner focused on creating a culture of performance for <a href="https://www.slideshare.net/cliffcrocker/walmart-web-performance-circa-2013" target="_blank" rel="noopener">one the world&rsquo;s largest brands</a>.</p><h2>What am I most excited about?</h2> <p>As Chief Product Officer for SpeedCurve, I&rsquo;m thrilled to continue this journey. I&rsquo;ve been a longtime fan of the product and can&rsquo;t wait to start contributing to its growth and adding more value for our customers!</p> <p>Here are some of the areas you&rsquo;ll see me getting most excited about:</p> <h3>RUM + Synthetic</h3> <p>I LOVE how the team has focused on showing real user data (LUX) with synthetic (WebPageTest). Mark and I started <a href="https://www.slideshare.net/cliffcrocker/synthetic-and-rum-best-of-bo" target="_blank" rel="noopener">exploring this years ago</a>, and I feel like we're just now scratching the surface of what&rsquo;s possible. I&rsquo;ll be looking at ways we can continue to combine and compare these datasets for new insights while continuing to educate practitioners on how best to leverage the unique perspective each technology brings.</p> <h3>Building a more inclusive web</h3> <p>Traditionally, we&rsquo;ve spent a lot of time focusing on entitled groups as it relates to performance &ndash; fast connection speeds, devices with high-end CPUs, low-latency geographies. While it&rsquo;s important to understand the characteristics of these users, I would argue that the more important segment to focus on exists in the longtail. I&rsquo;ve been inspired by <a href="https://www.youtube.com/watch?v=6vMvg38CXFk" target="_blank" rel="noopener">Tim Kadlec&rsquo;s talk on this</a> and am thrilled to start looking at ways to highlight this in our products.</p> <h3>Building performance culture across the organization</h3> <p>While you may say to yourself &ldquo;nothing new here&rdquo;, every day I see more and more opportunity to bring performance into the mainstream. Whether we adopt performance as a principle in our design systems, set and maintain performance budgets for product owners, <a href="/blog/performance-testing-in-ci-lets-break-the-build/">integrate performance tests into our build systems</a>, or simply create a conversation with non-technical users around perceived performance, there is always more to do in our organizations. Making performance data consumable by the masses is perhaps the thing I love most about SpeedCurve, and the thing I&rsquo;m most excited to be contributing to and talking to you about...</p> <p>...with one exception...</p> <h3>I&rsquo;m most excited about keeping the focus on you!</h3> <p>Building products and features &ldquo;outside-in&rdquo; is my top priority and guiding principle. SpeedCurve is known for this today and I plan to do even more on behalf of you as we prioritize and build our roadmap. Understanding your pain, your users&rsquo; pain, and shaping products and solutions to make your job easier is what I care about most.</p> <h2>What can you expect from me?</h2> <p>While I&rsquo;m diving into product, vision, and strategy, I&rsquo;ll also be working closely with Tammy in her outreach to customers and prospective users to get insight as we build out our roadmap for SpeedCurve over the next year.&nbsp;</p> <p>Keep an eye out for me <a href="https://twitter.com/cliffcrocker" target="_blank" rel="noopener">on Twitter</a>, and at events and meetups in your area. If you&rsquo;d like to chat about the direction of SpeedCurve's products &ndash; or if you&rsquo;d just like to catch up and learn more about us &ndash; <a href="mailto:support@speedcurve.com" target="_blank" rel="noopener">I&rsquo;d love to hear from you</a>!&nbsp;</p> Mon, 04 Nov 2019 00:00:00 +1300 New! User Happiness metric, CI plugin, and an inspiring third-party success story https://speedcurve.com/blog/october-2019-news <p>Here at SpeedCurve, the past few months have found us obsessing over how to define and measure user happiness. We've also been scrutinizing JS performance, particularly as it applies to third parties. And as always, we're constantly working to find ways to improve your experience with using our tools. See below for exciting updates on all these fronts.</p> <p>As always, we love hearing from you, so please send your feedback and suggestions our way!</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/SpeedCurve-folks.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p><h2>New metric! User Happiness Score</h2> <p>The goal of making websites faster is to make users happier. Since user happiness can't be measured directly, we've developed the <a href="https://support.speedcurve.com/en/articles/3380780-user-happiness" target="_blank" rel="noopener">User Happiness metric</a>. It's a combination of multiple performance metrics that are closely tied to delivering a joyous user experience. Combining these into an aggregate metric makes User Happiness more applicable across a wider variety of websites and conditions.&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/User-Happiness.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Another new metric! Largest Contentful Paint</h2> <p>On some pages, the most important content is visual. As its name suggests, Largest Contentful Paint is a new metric that can help you know when the largest element (image or video) in the viewport is rendered. It's provided by browsers via the <a href="https://wicg.github.io/largest-contentful-paint/" target="_blank" rel="noopener">Largest Contentful Paint API</a>, and it's now available in both SpeedCurve Synthetic and LUX. Here&rsquo;s a good example of LCP on The New York Times home page:&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Largest-Contentful-Paint.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p><strong>More:</strong> <a href="https://support.speedcurve.com/en/articles/74078-what-do-the-different-speedcurve-metrics-represent" target="_blank" rel="noopener">Glossary of popular SpeedCurve metrics</a></p> <h2>Case study: Improving third-party performance at The Telegraph</h2> <p><a href="https://medium.com/the-telegraph-engineering/improving-third-party-web-performance-at-the-telegraph-a0a1000be5" target="_blank" rel="noopener">Here's a great success story</a> from our friends at The Telegraph: "By using custom performance marks in the ad code, deferring JavaScript and reducing bundle sizes, the First Ad Loaded metric improved by an average of 4 seconds." (<a href="/customers/" target="_blank" rel="noopener">See more great case studies.</a>)</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/The-Telegraph.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Custom colors in your charts</h2> <p>Now you can standardize your site's colors across all your SpeedCurve charts. Just go to your Settings page, click on the site, then use the color picker to select your custom color.​</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Color-picker.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Copy your Favorites dashboards</h2> <p>Sometimes you may find yourself needing to create a new Favorite dashboard that's very similar to an existing one. Now you don't have to build it from scratch. You can copy the existing dashboard and then use the chart filters to change whatever variable you need to change. (<a href="https://support.speedcurve.com/en/articles/965659-create-custom-dashboards-and-charts" target="_blank" rel="noopener">Learn more about creating Favorite dashboards and charts.</a>)</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Copy-dashboard.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Get SpeedCurve status updates</h2> <p>If you're ever wondering about SpeedCurve's uptime or if we're experiencing technical issues, <a href="http://status.speedcurve.com/" target="_blank" rel="noopener">visit our status page</a>. From there you can also subscribe to receive updates.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Status-page.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Is your monitoring fully set up?</h2> <p>We want to make sure you're getting the most possible value from your SpeedCurve account. We recently added a setup guide (visible in the left-hand navbar) to help you identify which steps you still need to complete.​</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Setup-guide.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Netlify build plugin for SpeedCurve</h2> <p>If you use Netlify and SpeedCurve, then you might be interested in <a href="https://timkadlec.com/remembers/2019-10-18-netlify-speedcurve-build-plugin/" target="_blank" rel="noopener">a plugin that Tim Kadlec recently created</a> to trigger a round of tests in SpeedCurve for each deploy.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Netlify-plugin.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>It's about your JavaScript...</h2> <p>In October, I had the privilege of speaking at JAMstack SF. I talked about JS performance gotchas, the best metrics to explore, and how to use performance budgets to deliver and maintain the better experience that the JAMstack promises. (Video <a href="https://youtu.be/31WieWrYPqc" target="_blank" rel="noopener">here</a>.)​​</p> <p><a href="https://youtu.be/31WieWrYPqc" target="_blank" rel="noopener"><img class="blog-img" src="https://img.speedcurve.com/blog/JAMstack.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h2>"You&rsquo;re not going to have a company if you don&rsquo;t have happy users."</h2> <p>I'm so excited about the launch of the Planet Performance podcast. In the first episode, <a href="https://podcast.perfplanet.com/#1" target="_blank" rel="noopener">Stoyan Stefanov interviews our very own Steve Souders</a>. Among other things, Stoyan and Steve talk about the early days of performance and why you're not going to have a company if you don't have happy users. Bonus: You get to hear Steve play the ukulele! :)</p> <h2>No such thing as too many webperf podcasts</h2> <p>Speaking of podcasts, Tim Kadlec has already put out two episodes of <a href="https://chasingwaterfalls.io/" target="_blank" rel="noopener">Chasing Waterfalls</a> &ndash; conversations with the people working to make the web faster for everyone. The first episode was with Malek Hakim, about <a href="https://chasingwaterfalls.io/episodes/episode-one-with-malek-hakim/" target="_blank" rel="noopener">creating a performance culture at Priceline</a>. Episode 2 was with Reefath Rajali, who talks about <a href="https://chasingwaterfalls.io/episodes/episode-two-with-reefath-rajali/" target="_blank" rel="noopener">PayPal's performance journey</a>.&nbsp;​</p> <h2>Find me at Beyond Tellerrand and PerfNow in November!</h2> <p>In November, I'll be attending <a href="https://beyondtellerrand.com/events/berlin-2019/" target="_blank" rel="noopener">Beyond Tellerrand</a> in Berlin (November 13-16) and then&nbsp;&nbsp;<a href="https://perfnow.nl/" target="_blank" rel="noopener">performance.now()</a> in Amsterdam (November 21-22), which I'm co-chairing alongside Tim Kadlec. Each of these events has a fantastic speaker lineup, and SpeedCurve is proud to be sponsoring both events. If you're there, be sure to say hi!</p> Wed, 30 Oct 2019 00:00:00 +1300 Getting started with web performance? Here's what you need to focus on. https://speedcurve.com/blog/getting-started-web-performance <p>A while back, our friends at Shopify published <a href="https://www.shopify.com/partners/blog/narrative-web-performance" target="_blank" rel="noopener">this great case study</a>, showing how they optimized one of their newer themes from the ground up &ndash; and how they worked to keep it fast. Inspired by that post, I wanted to dig a bit deeper into a few of the best practices they mentioned, which fall loosely into these three buckets:</p> <ol> <li>Analyze your pages &ndash; understand the critical rendering path and page composition.</li> <li>Create performance budgets and fight regression.</li> <li>Build a performance culture that embraces collaboration between design and dev.</li> </ol> <p>Keep reading to learn how you can apply these best practices to your own site and give your pages a speed boost.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/comparison-chart.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p><h2>What's hurting the user experience?</h2> <p><span style="font-size: 15px;">When we think about things that can hurt the user experience, it's important to know that issues fall into two camps:</span></p> <ul> <li><span style="font-size: 15px;"><strong>Blocking resources</strong> &ndash; Resources like CSS, JS (including third parties), custom fonts, etc., which can block the critical rendering path.</span></li> <li><span style="font-size: 15px;"><strong>Non-blocking resources</strong> &ndash; Resources that are so numerous or so poorly optimized that they hamper the CPU and cause jankiness and a poor user experience.</span></li> </ul> <p><span style="font-size: 15px;">Blocking resources, as their name suggests, block the critical rendering path. The critical rendering path is the set of steps browsers must take to convert HTML, CSS and JavaScript into living, breathing websites. To optimize for performance, you need to understand what happens in the steps between receiving the HTML, CSS, and JavaScript bytes and the processing that's required to turn them into rendered pixels.&nbsp;</span></p> <p><span style="font-size: 15px;"><strong>It's not enough to focus on when the page first starts displaying pixels &ndash; you need to make sure you're showing content your users care about.</strong> That's why it's a good idea to not just focus on metrics like Start Render &ndash; you should also investigate <a href="/blog/web-performance-monitoring-hero-times/" target="_blank" rel="noopener">Hero Rendering metrics</a>, which track when the most meaningful content on your pages (e.g., hero images, headlines) renders.</span></p> <p><strong>It's also not enough to focus on blocking resources. It's possible for pages to contain zero blocking resources and still have less-than-optimal performance because of how your JavaScript is rendered.</strong>&nbsp;That's why it's so important to understand CPU usage on your pages &ndash; because JavaScript consumes more CPU than all other browser activities combined. While JS blocks the CPU, the browser can't respond to user input. This creates what&rsquo;s commonly called &ldquo;jank&rdquo; &ndash; that annoying feeling of jittery, unstable page rendering.&nbsp;</p> <p>To help focus attention on CPU usage, we&rsquo;ve been evangelizing <a href="/blog/new-lux-metrics/" target="_blank" rel="noopener">a couple of new performance metrics</a>:</p> <ul> <li><strong>First CPU Idle</strong> measures when the page is no longer janky. Specifically, it's the first span of 5 seconds where the browser main thread is never blocked for more than 50ms after First Contentful Paint. A value of 2-4 seconds is typical.</li> <li><strong>Total Long Task CPU Time</strong> is the sum of all long tasks that occur in the page. A "long task" is a browser event that blocks the main thread for more than 50ms.</li> </ul> <p>If you still need to be convinced, this correlation chart shows a distinct correlation between increased CPU Time and higher bounce rates:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/jscpu-bouncerate.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>(If you're a SpeedCurve LUX user, this chart is at the top of your JavaScript dashboard. If you're not a LUX user, <a href="https://support.speedcurve.com/articles/1266080-get-started-with-lux-real-user-monitoring" target="_blank" rel="noopener">here's how you can try it for free</a>.)</p> <p>After you understand First CPU Idle and CPU Time, there are a couple more metrics that will help you understand the relationship between the rendering path and how people interact with your pages:</p> <ul> <li><strong>First Interaction Time</strong> is the first time a user interacts with a page &ndash; by either scrolling, clicking, or using the keyboard. (At SpeedCurve we call these metrics "IX Time" and they're available on your LUX Performance dashboard.) First Interaction Time can vary widely depending on the type of site and page. For example, a search results page might have a low First Interaction Time because users scroll and click quickly. A media site, on the other hand, might have a higher First Interaction Time because users start reading content before they interact with the page.&nbsp;</li> <li><strong>First Input Delay</strong> measures the gap between when a user interacts (e.g., clicks or scrolls)&nbsp;with the page and when the browser acts on that input. A good target for FID is 10ms, though it's common to see results as high as 25ms is common. (FID is also available on your LUX Performance dashboard.)</li> </ul> <p>A few things to keep in mind when you're looking at all these metrics in relation to one another:</p> <ul> <li>Know how many blocking resources are on your pages. Wherever possible, load them asynchronously or even defer them.</li> <li>Observe how often First Interaction Time is <em>after</em> First CPU Idle.</li> <li>Understand the amount of CPU time that's consumed by Long Tasks.</li> <li>Monitor your longest Long Tasks.</li> <li>Track First Input Delay relative to interaction and rendering times.</li> </ul> <p><strong>Read more: <a href="/blog/measuring-jank-and-ux/">Measuring Jank and UX</a></strong></p> <h2>Understand page bloat</h2> <p>According to <a href="https://httparchive.org/reports/page-weight" target="_blank" rel="noopener">HTTP Archive data for the top million websites</a>, the median page served to desktop is close to 1900 KB. The median page served to mobile isn&rsquo;t much smaller, at close to 1700 KB. It&rsquo;s important to remember that these numbers are medians. I routinely see pages that are between 5 and 10 MB in size. Images account for roughly half the size. JavaScript, fonts, and video carry the bulk of the rest of the weight.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/HTTPArchive-page-size.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>It's important to note that you can have large, robust pages that still feel fast. Take Amazon, for example. It's widely considered to be a performance leader, yet it has relatively heavy pages. (I'm defining "heavy" as 3MB or more.)</p> <p>But you should still keep an eye on page and resource sizes for a couple of reasons:</p> <ul> <li><strong>Consider the cost and performance impact</strong> of serving bloated pages to mobile users who are dealing with bandwidth constraints or data limits.&nbsp;</li> <li><strong>Sudden increases in page size can also be an indicator that you&rsquo;ve got rogue unoptimized images (or other assets)</strong> that could be wreaking havoc on user experience. For example, I see this particularly with hero images on campaign landing pages, which are sometimes built and released quickly without proper due diligence paid to ensuring they&rsquo;re performant.</li> </ul> <h2>Create performance budgets</h2> <p>Performance budgets are a vital tool in your web performance toolbox. They take the hassle out of monitoring your page performance by notifying you whenever your metrics cross a certain threshold.</p> <p>If you've been following along so far, you may already be guessing that it's a good idea to consider creating performance budgets for the CPU- and size-related metrics we've covered. You should also consider creating performance budgets for:</p> <ul> <li><strong>Start render</strong> (synthetic and RUM): 2 seconds recommended</li> <li><a href="https://support.speedcurve.com/articles/2645927-how-is-speed-index-calculated" target="_blank" rel="noopener"><strong>Speed Index</strong></a> (synthetic only): 4 seconds recommended</li> <li><a href="/blog/last-painted-hero/" target="_blank" rel="noopener"><strong>Last Painted Hero</strong></a> (synthetic): 5 seconds recommended</li> </ul> <p>IMPORTANT: These defaults are intended to be a jumping-off point for your own analysis. You may find that some of these metrics and numbers are relevant for your site, while others may be less relevant. If you're tracking custom metrics, you probably want to create performance budgets for them.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/perf-budget-start-render.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>Since Google research suggests that you should aim to be at least 20% faster than your fastest competitor, it might also be a good idea to monitor your competitors' sites so you can create budgets that will help you stay faster than the competition.</p> <p>To motivate you, here are some real-world performance budget wins:</p> <ul> <li><a href="https://medium.com/caspertechteam/we-shaved-1-7-seconds-off-casper-com-by-self-hosting-optimizely-2704bcbff8ec" target="_blank" rel="noopener">Casper used perf budgets</a> to track the performance impact of self-hosting a third-party script.&nbsp;</li> <li><a href="https://www.zillow.com/engineering/bigger-faster-more-engaging-budget/" target="_blank" rel="noopener">Zillow set budgets</a> for their quantity (e.g. image size) and milestone timing metrics in mobile search.&nbsp;</li> </ul> <p><strong>Read: <a href="https://support.speedcurve.com/articles/1539827-create-performance-budgets-and-set-alerts" target="_blank" rel="noopener">How to create performance budgets and set alerts</a></strong></p> <h2>Fight performance regression</h2> <p>Ask anyone who&rsquo;s been in the performance space for a while, and they&rsquo;ll tell you that making your pages faster isn&rsquo;t the hardest part &ndash; it&rsquo;s <em>keeping</em> your pages fast. Over time, so many insidious factors can cause pages to slow down:</p> <ul> <li>New features</li> <li>More third-party scripts</li> <li>Changes to your code base</li> <li>Team changes</li> <li>Your company de-prioritizes performance</li> </ul> <p><strong>One of the most effective ways to fight performance regression is to integrate performance testing into your continuous delivery process.</strong> This is a natural extension of using performance budgets in an ongoing, meaningful way. In an ideal setup, the build is blocked until performance testing is complete, and it can potentially fail if the performance budgets for any tests are violated. In other words, performance regressions are caught before they make it to production. Treating performance as a first-class acceptance criteria creates a complete feedback loop for teams to manage the performance of their work.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/continuous-integration.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p><strong>Read: <a href="/blog/performance-testing-in-ci-lets-break-the-build/" target="_blank" rel="noopener">Performance testing in CI: Let's break the build!</a></strong></p> <h2>Build a culture of web performance throughout your company</h2> <p>Shopify emphasizes that collaboration between designers and developers was a critical part of the success of their project:</p> <blockquote> <p>&ldquo;Collaborate with other disciplines, and contribute to levelling up their work by considering performance.&rdquo;</p> </blockquote> <p>At SpeedCurve, we talk a lot about &ldquo;performance culture&rdquo; and what that looks like. In simple terms, creating a strong performance culture means creating a feedback loop in your company or team that gets people to care, shows them what they can do to help, and then gives them positive reinforcement when you get results. It's surprisingly easy to skip these steps and then wonder why all your performance efforts feel like such a painful uphill slog &ndash; and why regression is inevitable.</p> <p>Some performance culture best practices include:</p> <ul> <li>Identify people&rsquo;s goals and the performance metrics that correlate to those goals.</li> <li>Connect the dots. For example, correlation charts, like the one below, show people the relationship between performance metrics and conversion rate.&nbsp;</li> <li>Benchmark your site against your competitors.</li> <li>Collaborate on performance budgets. I can&rsquo;t emphasize this enough: performance budgets shouldn&rsquo;t be a top-down process.</li> <li>Score some quick, inspiring wins by fixing the low-hanging fruit. The first places to look are images and blocking stylesheets and scripts (especially third parties).</li> <li>Share and celebrate. This can be in the form of company- or department-wide emails, posts on your in-house dev blog, and internal meetups.</li> </ul> <p><img class="blog-img" src="https://img.speedcurve.com/blog/conversion-rate-correlation.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p><strong>Read: <a href="https://support.speedcurve.com/articles/1548003-performance-culture-tips-and-best-practices" target="_blank" rel="noopener">Performance culture tips and best practices</a></strong></p> <h2>You can't fix what you don't measure</h2> <p>The first step is to understand how your pages perform and identify roadblocks. If you're already a SpeedCurve user, you can start trying out these tips right away. If you're not a SpeedCurve user, <a href="/setup/trial/">give us a try for free!</a></p> Tue, 25 Jun 2019 00:00:00 +1200 Performance testing in CI: Let's break the build! https://speedcurve.com/blog/performance-testing-in-ci-lets-break-the-build <p>Raise your hand if you've ever poured countless hours into making a fast website, only to have it slowly degrade over time. New features, tweaks, and Super Important Tracking Snippets all pile up and slow things down. At some point you'll be given permission to "focus on performance" and after many more hours, the website will be fast again. But a few months later, things start to slow again. The cycle repeats.</p> <p>What if there was a way that you could prevent performance from degrading in the first place? Some sort of performance gateway that only allows changes to production code if they meet performance requirements? I think it's time we talked about having performance regressions break the build.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Screenshot_2019-06-12 Output Screenshot Generator.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Output of the speedcurve deploy command" /></p><h2>The secret to a faster website? Break the build!</h2> <p>If "breaking the build" is a foreign concept to you, then allow me to explain. Continuous integration ("CI") is a stepping stone on the journey to streamlined software delivery. With sufficient automated testing, you can have a high level of confidence that an isolated change can be built and integrated without breaking anything else. If any of the automated tests fail, then the build is broken and the change cannot be integrated.</p> <p>This concept can be extended even further by automatically deploying changes to testing or staging environments (continuous <em>delivery</em>), running more automated tests, and potentially even deploying the change to a production environment with zero human input (continuous <em>deployment</em>).</p> <h2>Performance as acceptance criteria</h2> <p>When automated testing is talked about in the context of CI, it almost exclusively refers to <em>functional</em> testing - testing whether a feature&nbsp;<em>functions</em> as expected. Performance typically doesn't impact the functionality of a feature, so it is often absent from the list of acceptance criteria. However, if our goal is to prevent performance regressions then performance must become a <em>non-functional</em> requirement in our acceptance criteria. We want to be able to break the build and block a change from being shipped if its performance is not up to standard.</p> <h2>Where performance fits in a CI pipeline</h2> <p>So where in a CI/CD pipeline do we put performance testing? The easy answer is: right after a change is deployed to an integration or testing environment. Typically, performance testing should happen at the same time as integration and acceptance testing. The slightly more complex answer is: it depends. For performance testing to be accurate, the integration environment should replicate the production environment as closely as possible. Here's a short (and definitely not exhaustive) list of things that you may want to consider when running performance tests on an integration environment:</p> <ul> <li>Caches may need to be warmed up beforehand. Production environments typically have high cache hit ratios, and this should be replicated during performance testing.</li> <li>If system resources are a constraint, it may be better to run performance testing in isolation. Running it at the same time as integration testing or load testing could cause resource contention that negatively affects performance.</li> <li>Network latency will affect performance testing. If your production environment is accessed via a CDN, try to run your integration environment through the same CDN.</li> </ul> <h2>Performance in CI without breaking the build</h2> <p>I know, I know. The title of this post says that to be fast you have to break the build! The reality is that many software delivery teams are not in a position to do this. Most stakeholders that I've worked with would find it unacceptable to block an important feature or bug fix due to it failing performance tests.</p> <p>Thankfully, there are some other options. Let's go through them, starting with the holy grail: staying fast by breaking the build.</p> <h3>Break the build on performance regressions</h3> <p>The build is blocked until performance testing completes, and can potentially fail if any performance tests fail. This option only works in teams that have 100% buy-in from all levels, since they will need to fix performance issues before they can continue with any other work.</p> <p><strong>Pros</strong></p> <ul> <li>Treats performance as a first-class acceptance criteria.</li> <li>Creates a complete feedback loop for teams to manage the performance of their work.</li> <li>Performance regressions are caught before they make it to production.</li> </ul> <p><strong>Cons</strong></p> <ul> <li>Increases build time.</li> <li>Requires buy-in from the whole team.</li> </ul> <h3>Report performance regressions but do not break the build</h3> <p>The build can be blocked until performance testing completes, but this is not mandatory. Any performance test failures are reported but do not fail the build. This option works well in teams with a strong performance culture who take performance regressions seriously. Performance issues won't block the build and delay important work, but they will be treated as a high priority and addressed in a timely manner.</p> <p><strong>Pros</strong></p> <ul> <li>Provides actionable feedback loop for teams to fix performance regressions.</li> <li>Performance regressions can be caught before production.</li> <li>Doesn't block things from being pushed to production.</li> </ul> <p><strong>Cons</strong></p> <ul> <li>Requires strong discipline to prevent performance regressions.</li> </ul> <h3>Trigger performance tests without any reporting</h3> <p>Performance tests are triggered as part of the build but do not block anything. This option is good for teams who are just starting to monitor performance, or who prefer to have regular "performance sprints" rather than fix regressions as they occur.</p> <p><strong>Pros</strong></p> <ul> <li>Can be used to retrospectively identify the build that caused a performance regression.</li> <li>Doesn't require any buy-in from team members.</li> <li>Can be easily transformed into other options later.</li> </ul> <p><strong>Cons</strong></p> <ul> <li>Requires strong discipline to prevent performance regressions.</li> <li>Makes it easy to consider performance as a "nice to have" feature or forget about it entirely.</li> </ul> <h2>Using the SpeedCurve CLI to monitor performance</h2> <p>SpeedCurve recently released an official <a href="https://github.com/SpeedCurve-Metrics/speedcurve-cli">CLI and Node.js API</a> that simplifies running performance tests as part of a CI/CD pipeline. I'll put some example commands below to give you an idea of how it can be used.</p> <pre style="background-color: #282a36; font-size: 16px; padding: 8px 12px;"><i style="color: #b9b9b3;">Option 1: Break the build on performance regressions.<br />Runs performance tests and waits until they finish. Upon completion, checks the<br />status of any performance budgets and exits with a non-zero exit code if any<br />budgets were broken.</i><br /><b style="color: #b3ae8f; font-size: 125%;">&rArr; speedcurve deploy --check-budgets</b><br /><br /><i style="color: #b9b9b3;">Option 2: Report performance regressions but do not break the build.<br />Runs performance tests and waits until they finish. Then uses the "budgets"<br />command to output the status of all performance budgets as JSON.</i><br /><b style="color: #b3ae8f; font-size: 125%;">&rArr; speedcurve deploy --wait<br />&rArr; speedcurve budgets --json</b><br /><br /><i style="color: #b9b9b3;">Option 3: Trigger performance tests without any reporting.<br />Runs performance tests but does not wait for them to finish. The --note flag<br />annotates the deploy in SpeedCurve so that this build can be identified when<br />reviewing performance regressions at a later date.</i><br /><b style="color: #b3ae8f; font-size: 125%;">&rArr; speedcurve deploy --note v2.48.0-b28bc40</b></pre> <p>If you'd like to try out the SpeedCurve CLI for yourself, head on over to <a href="https://github.com/SpeedCurve-Metrics/speedcurve-cli">the GitHub project</a> for installation instructions and usage examples. If you don't already have a SpeedCurve account, you can <a href="/setup/trial/">start a free trial</a> and begin testing your pages within minutes.</p> Wed, 19 Jun 2019 00:00:00 +1200 Third party blame game https://speedcurve.com/blog/third-party-blame-game <p>Our third party metrics and dashboard have had an exciting revamp. With new metrics like blocking CPU, you can now see exactly who is really to blame for a crappy user experience. We've also given you the ability to monitor individual third parties over time and create performance budgets for them.</p> <h2>It's not you, it's me</h2> <p>Or is it really you, and not me? We now automatically group all the requests in our third party waterfall chart, letting you easily identify all the third party services used on your website.</p> <p><a href="/demo/thirdparty/?b=chrome&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906&amp;share=39tfnozeq94p1o0hndk1kpbg4vb7cg"><img class="blog-img" src="https://img.speedcurve.com/blog/third_party_waterfall.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Third Party Waterfall" /></a></p> <p>For each third party, you get the number of requests and size for each content type. There's also a first party comparison you can toggle on/off to see what proportion of your requests come from first party vs third party.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/latest_third_party_requests.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Latest Third Party Requests" /></p><h2>Blocking JS, CSS &amp; CPU</h2> <p>People love to hate on third parties and blame all their user experience issues on them.</p> <blockquote> <p>Look at all those requests, it must be them!</p> </blockquote> <p>We don't believe that just looking at the number of requests or the size of requests a third party makes is a good enough indicator that they are a bad actor. A well-built web page that manages its requests can easily negate any issues by delaying those request till after the page is rendered and interactive.</p> <p><strong>What really matters is how a third party might be blocking the rendering or the interactivity of the page. </strong></p> <p>So for each third party, we show you if it includes any blocking JS or CSS requests. This tells you if the rendering of the page is being delayed by a blocking request from a third party. We also look for any blocking CPU caused by a third party. Blocking CPU is any JS function that takes longer than 50ms (also known as a <a href="https://github.com/w3c/longtasks">long task</a>), which often leads to <a href="/blog/measuring-jank-and-ux/">page jank.</a> Blocking CPU stops your users from smoothly interacting with your page and delays other metrics like <a href="https://developers.google.com/web/tools/lighthouse/audits/first-cpu-idle">First CPU Idle</a> and <a href="https://github.com/WICG/time-to-interactive#definition">Time To Interactive.</a> These third party blocking metrics are a far better indicator of who might be causing real issues on your page.</p> <p>In this example, Vidible has 594ms of blocking CPU, causing jank on the page, while all the other third parties don't trigger any signifiant CPU activity at all. This helps you quickly focus in on which third parties are causing real user experience problems.&nbsp;&nbsp;</p> <p><a href="/demo/thirdparty/?b=chrome&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906&amp;share=39tfnozeq94p1o0hndk1kpbg4vb7cg"><img class="blog-img" src="https://img.speedcurve.com/blog/latest_third_party_cpu.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h2>Collect the evidence!</h2> <p>For any third party in your waterfall, you can turn on "Track History" and we'll collect detailed third party metrics every time we run a test. You can then monitor a third party over time and set performance budgets and alerts. This is a great way to keep an eye on any changes a third party might be making and alerting you to impacts on your page. You could even agree to an SLA with a third party and then use SpeedCurve to monitor and enforce it, keeping everyone honest and on the same page.&nbsp;&nbsp;</p> <p><a href="/demo/thirdparty/?b=chrome&amp;cs=lg&amp;d=30&amp;dc=2&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906&amp;share=39tfnozeq94p1o0hndk1kpbg4vb7cg"><img class="blog-img" src="https://img.speedcurve.com/blog/third_party_history.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h2>Track any request</h2> <p>Even though it's called third party, you can actually build your own custom filters and track any group of requests you like. You can even track the history and set performance budget and get alerts for a single request. If your task is to trim down a specific JS request and make sure its size or CPU usage is within budget, then you can setup a specific filter and monitor your improvements.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/third_party_custom.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Custom Third Party Filters" /></p> <h2>Contribute</h2> <p>We used to have our own in-house library for identifying third parties but we've now switched to <a href="https://github.com/patrickhulce/third-party-web">third-party-web</a> by Patrick Hulce, which has a quickly growing list of third parties. Many people in the perf community, such as Simon Hearne of <a href="https://simonhearne.com/2015/find-third-party-assets/">requestmap</a> fame, have been identifying and contributing third parties to third-party-web &ndash; and we've recently added a bunch, too! If you see any "Unrecognized Third Party" requests in your waterfall charts, then you can <a href="https://github.com/patrickhulce/third-party-web#contributing">contribute them to the project.</a>&nbsp; &nbsp;&nbsp;</p> <h2>Getting started</h2> <p>If you already use SpeedCurve, then you can start tracking your third parties straight away in your Settings or on the Synthetic &gt; Third Party dashboard. Otherwise, <a href="/setup/trial/">kick off a free trial</a> to see if it's a third party that's eating up your bandwidth and CPU, or your own requests.</p> Wed, 15 May 2019 00:00:00 +1200 Measuring Jank and UX https://speedcurve.com/blog/measuring-jank-and-ux <p>Ten years ago the network was the biggest problem when it came to making websites fast. Today, CPU is the main concern. This happened because networks got faster while JavaScript moved in the other direction&nbsp;<a href="/blog/javascript-growth/">growing 3x in size in the last six years</a>. This growth is important because <a href="/blog/javascript-dominates-browser-cpu/">JavaScript consumes more CPU than all other browser activities combined</a>. While JavaScript and other activities block the CPU, the browser can't respond to user input creating the sensation of a slow, jittery, or broken page, AKA "jank".</p> <p>To help focus our attention on CPU, several new performance metrics have been defined and evangelized over the last year or three. In this post I'm going to focus on these:</p> <ul> <li><a href="https://developers.google.com/web/tools/lighthouse/audits/first-cpu-idle">First CPU Idle</a>&nbsp;measures when the page is no longer janky. Specifically, it is the first span of 5 seconds where the browser main thread is never blocked for more than 50ms after First Contentful Paint. A value of 2-4 seconds is typical.</li> <li><a href="https://developers.google.com/web/updates/2018/05/first-input-delay">First Input Delay</a>&nbsp;measures the gap between when a user interacts with the page (e.g, clicks or scrolls) and when the browser is able to act on that input. First Input Delay values are much lower -&nbsp;a good target is 10ms, but 25ms is common.</li> <li><a href="https://support.speedcurve.com/understanding-metrics/what-do-the-different-speedcurve-metrics-represent#interaction-ix-metrics-lux">First Interaction Time</a> is when the first user input takes place. This varies widely depending on the type of site and page. A good search results page might have a low First Interaction Time because users scroll and click quickly. A media site might have a high First Interaction Time because users start reading content (headlines, stories) before interacting with the page. At SpeedCurve we call this "IX Time".</li> <li><a href="https://www.w3.org/TR/longtasks/">Total Long Task CPU Time</a> is the sum of all long tasks that occur in the page. A "long task" is&nbsp;a browser event that blocks the main thread for more than 50ms.</li> </ul> <p>Here's a figure to help visualize these metrics.</p> <p><img class="blog-img" src="/img/blog/cpu-timeline-after.png" alt="" /></p><p>The figure above is a (slightly modified) CPU timeline from&nbsp;<a href="https://webpagetest.org/">WebPageTest</a>. Long Tasks (where the CPU is blocked for more than 50ms) are shown in red. In the timeline above there are two long tasks.&nbsp;Green indicates where there are no Long Tasks. First CPU Idle happens at 3.0 seconds - this is the first point in the timeline where there are 5 seconds without any Long Tasks (from 3s to 8s). In this timeline the user first interacted with the page around 5.5s - this is the First Interaction Time (or IX Time). Since there were no Long Tasks, the browser was able to respond to the user's input in only 8ms, which gives us the First Input Delay (shown in blue).</p> <p>As illustrated by this example, looking at the relationship between these metrics is the key to determining whether jankiness is affecting your users, and why.</p> <p>In the timeline above, First Interaction Time&nbsp;is after First CPU Idle, so it makes sense that First Input Delay&nbsp;is very fast - there's nothing blocking the CPU. Seems obvious, but typically when I talk with performance folks about First Input Delay&nbsp;the discussion focuses on how First Input Delay&nbsp;is thwarted by Long Tasks, but if First Interaction Time is greater than First CPU Idle&nbsp;that's just not the case. So for site owners to appreciate what First Input Delay&nbsp;is telling them, it's important to know:</p> <p><em>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; How often is the first interaction after First CPU Idle?</em></p> <p>For our RUM customers, First Interaction Time is after First CPU Idle&nbsp;about 66% of the time. That's important to understand and keep in mind. It means that most of the time First Input Delay&nbsp;is not affected by Long Task CPU activity.</p> <p>About a third of the time the first interaction takes place before First CPU Idle. This scenario is illustrated in the figure below. In this example, the first interaction is unlucky enough to happen during a Long Task, which means the user has to wait until that Long Task is completed before their interaction can be handled. This is when we see First Input Delay values jump to hundreds of milliseconds.&nbsp;</p> <p><img class="blog-img" src="/img/blog/cpu-timeline-during.png" alt="" /></p> <p>It's not always the case that when first interaction happens before First CPU Idle&nbsp;it will overlap with a Long Task. In the timeline above it's much more likely that the user input will <em>not</em> collide with a Long Task, which would result in a fast First Input Delay value. In the example timeline below, however, there are many (short) Long Tasks, so it's likely that First Input Delay&nbsp;values will be higher leading to more jankiness. <em>It's important to understand the amount of CPU time being consumed by Long Tasks.</em></p> <p><img class="blog-img" src="https://dev.speedcurve.com/img/blog/cpu-timeline-during-many.png" alt="" /></p> <p>The timeline above has many Long Tasks resulting in higher First Input Delay&nbsp;values. However, the Long Tasks are fairly short, so First Input Delay&nbsp;values never exceed a few hundred milliseconds. The timeline below is a different story. It only has two Long Tasks, but one of them is almost 1.5 seconds long. (I've seen this in the real world!) If the first user input overlaps with this Long Task, we start seeing First Input Delay&nbsp;values over 1000ms. <em>It's important to understand how long your Long Tasks are.</em></p> <p><img class="blog-img" src="https://dev.speedcurve.com/img/blog/cpu-timeline-during-big.png" alt="" /></p> <p>One last thing to keep in mind about First Input Delay&nbsp;is that it doesn't take rendering into consideration. This is a big blind spot. Looking at the timeline at the very top, perhaps the reason the user waited until 5.5 seconds to interact with the page is because the critical content took a long time to render. In which case, if rendering times were improved, First Input Delay&nbsp;would get worse even though the number of Long Tasks and CPU consumed remained the same. That's because improving rendering would get the user interacting sooner causing them to overlap with the Long Tasks that previously were out of harm's way. <em>It's important to track&nbsp;First Input Delay&nbsp;relative to interaction and rendering times.</em></p> <p>This last point is why being vigilant about web performance is difficult. It's not possible to focus on one metric. Focusing on the user experience is the key. And when it comes to user experience, CPU and rendering are the most important metrics to watch. Fortunately, (here comes the pitch) SpeedCurve's RUM product, LUX, includes First CPU Idle, First Interaction Time, First Input Delay, Total CPU time, number of Long Tasks, median Long Task, and longest Long Task, as well as many rendering metrics. If you're not already using LUX, <a href="/setup/trial/">signup for free trial</a>.</p> <p>And keep these important takeaways in mind:</p> <ul> <li>Know how often First Interaction Time is after First CPU Idle.</li> <li>Understand the amount of CPU time being consumed by Long Tasks.</li> <li>Monitor your longest Long Tasks.</li> <li>Track First Input Delay relative to interaction and rendering times.</li> </ul> <p>&nbsp;</p> Wed, 01 May 2019 00:00:00 +1200 New LUX JavaScript Dashboards https://speedcurve.com/blog/new-lux-javascript-dashboards <p>As organizations work to improve performance for users around the world on slower networks and devices, the focus on JavaScript continues to grow. LUX's new JavaScript dashboards help to identify the problems and solutions for creating a fast, joyous user experience.</p> <p><a href="/features/lux/">LUX</a> is SpeedCurve's real user monitoring product. We launched it two years ago with four dashboards: Live, Users, Performance, and Design. Today we've added two more LUX dashboards: JavaScript and JS Errors. These new dashboards let you see the impact JavaScript has on your site and on your users with new metrics, including First CPU Idle and First Input Delay, and new features, such as correlation charts that show you how CPU time correlates with bounce rate.</p> <p><img class="blog-img" src="/img/blog/jscpu-bouncerate.png" alt="" /></p><h2>LUX JavaScript Dashboard</h2> <p>Ten years ago, the network was the primary bottleneck slowing down web pages. Today it's the browser CPU, especially on mobile devices, and <a href="/blog/javascript-dominates-browser-cpu/">JavaScript consumes more CPU than all other browser activities combined</a>. That's why LUX focuses on the impact JavaScript has on the CPU and on your users.</p> <p>LUX measures CPU using the <a href="https://www.w3.org/TR/longtasks/">Long Tasks API</a>. A "long task" is defined as a browser event that takes more than 50ms to execute. LUX shows the total of all long tasks, the longest long task, and number of long tasks in the page. In this example, an improvement made on March 22nd shaved off more than one second of CPU time:</p> <p><img class="blog-img" src="/img/blog/jscpu-metrics.png" alt="" /></p> <p>Long tasks make pages feel janky. Two metrics that capture jankiness are shown in the LUX chart below:&nbsp;</p> <ul> <li><a href="https://developers.google.com/web/updates/2018/05/first-input-delay">First Input Delay (FID)</a>&nbsp;measures the gap between when a user interacts with the page (e.g, clicks or scrolls) and when the browser is able to act on that interaction.</li> <li><a href="https://developers.google.com/web/tools/lighthouse/audits/first-cpu-idle">First CPU Idle</a> measures how long it takes before the page is no longer janky.</li> </ul> <p><img class="blog-img" src="/img/blog/jscpu-fid-fci.png" alt="https://speedcurve.com/img/blog/js-errors.png" /></p> <p>The LUX JavaScript dashboard uses heatmaps to help teams identify what they should work on next. The heatmap below shows how well different page types are performing against a set of JavaScript metrics. Green is good, yellow is okay, and red is poor. The first three page types have mixed results, but the fourth page is doing poorly across the board. Since it accounts for a large amount of traffic (5%), focusing on this page has the greatest chance for improvements that impact a large number of users.</p> <p><img class="blog-img" src="/img/blog/js-pagelabels.png" alt="" /></p> <p>In addition to showing heatmaps for page types, the LUX JavaScript dashboard also shows them for device types and browsers. The device type heatmap below indicates that tablets need the most attention.</p> <p><img class="blog-img" src="/img/blog/js-devicetypes.png" alt="" /></p> <h2>LUX JS Errors Dashboard</h2> <p>With the increased focus on and activity around improving JavaScript, it's important to track errors to make sure JavaScript enhancements don't break functionality. The LUX JS Errors dashboards helps you monitor and isolate errors.</p> <p>In addition to showing the total number of errors, the chart below shows the error rate. This is helpful if your traffic has regular peaks and valleys (e.g., weekends) where the number of errors might fluctuate but error rate should remain fairly flat. In the example, a JavaScript error on March 27th caused both metrics to spike!&nbsp;</p> <p><img class="blog-img" src="/img/blog/js-errors.png" alt="" /></p> <p>The list of Top Errors helps you identify the errors that are most affecting customers. The LUX Errors dashboard also shows the distribution of errors across top browsers, regions, and pages. You can click on any error message to drill down on it.</p> <p><img class="blog-img" src="/img/blog/js-error-messages.png" alt="https://speedcurve.com/img/blog/js-errors.png" /></p> <p>Note that "Script error" is typically from cross origin scripts where error details are not available. This can happen for third party scripts but also for scripts you own that are served from a different domain, such as a CDN. To see the error details you must include the&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes">crossorigin SCRIPT attribute</a>&nbsp;and the&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin">Access-Control-Allow-Origin response header</a>.</p> <p>The details for individual errors makes it easy to find and fix problems. The name of the offending script is given, or "HTML document" if the error occurred in an inline script. The line and column number help track down exactly where the error occurs.</p> <p><img class="blog-img" src="/img/blog/js-error-details.png" alt="" /></p> <h2>Get started</h2> <p>If you're already a LUX user, these JS dashboards are available in your LUX menu. If you're not using LUX, <a href="/setup/trial/">give it a try for free</a>.</p> Wed, 03 Apr 2019 00:00:00 +1300 Chart sizes and TV Mode https://speedcurve.com/blog/chart-sizes-tv-mode <p>SpeedCurve now has different chart sizes and a special TV Mode to help you build a performance culture in your organisation.&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/tv-mode.jpg?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="TV Mode" /></p> <p>From its inception, SpeedCurve has always been designed to look awesome on the big screen. <strong>We see SpeedCurve as not just a tool for debugging web performance, but as a communication tool to rally your organisation around the importance of web performance.</strong> SpeedCurve helps bring together the development, design, and management teams, and gets everyone focused on turning your product into a fast and joyous experience for your users.&nbsp;</p><h2>Chart sizes</h2> <p>In the dropdown at the top right of each dashboard you can now switch between three different chart sizes. The amount of information shown is tuned based on the chart size. Small charts providing a quick overview of trends in a dashboard, while larger sizes give you a lot more detail and metrics.&nbsp;</p> <p><img class="blog-img" style="max-width: 516px;" src="https://img.speedcurve.com/blog/dashboard_options.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" /></p> <h2>TV Mode</h2> <p>In the same dropdown you can also toggle TV Mode, which turns off the SpeedCurve navigation and lets you focus on just the charts themselves. This is ideal for putting a set of your favourite charts on a monitor in your office. (Pro tip: Many of our enterprise customers do this.) This is a great strategy that can help make your <a href="https://support.speedcurve.com/get-the-most-out-of-speedcurve/create-performance-budgets-and-set-alerts">performance budgets</a> visible and <a href="/blog/web-performance-culture/">build a performance culture</a> in your organisation.</p> <h2>Questions? Feedback?</h2> <p>As always, we welcome your input. We'd also love to learn how your organisation shares performance dashboards and the impact this had had on your business and culture. Let us know in the comments or at support@speedcurve.com.</p> <p>And if you're not using SpeedCurve yet, <a href="/setup/trial/">give us a try for free</a>!</p> Wed, 06 Mar 2019 00:00:00 +1300 JavaScript dominates browser CPU https://speedcurve.com/blog/javascript-dominates-browser-cpu <p><a href="/blog/load-scripts-async/">Loading scripts asynchronously</a> is critical for getting pages to render more quickly. We care about rendering because that's what users see; if rendering is slow users have a negative experience. But it's not just about what users see - how the site <em>feels</em> is also important. That's why we focus so much on CPU time. If the CPU is blocked, then browsers are delayed responding to user interactions like scrolling and clicking on links. In other words, the page feels <em>janky</em>. And what consumes the most CPU in browsers? You guessed it: JavaScript!</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/cpu-median.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Desktop median CPU times" /></p><p>The pie chart above comes from&nbsp;<a href="https://discuss.httparchive.org/t/cpu-time-breakdown/1510">a study based on data from the HTTP Archive</a>. It shows browser CPU time broken down into buckets. I use colors to show the high-level categories: orange for JavaScript, purple for Layout, green for Paint, and blue for Loading. These are the median values across 1.3 million sites on desktop. Here's a similar chart for mobile:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/cpu-median-mobile.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="CPU median for mobile" /></p> <p>The absolute values are higher for mobile, but the key is that in both charts <em>JavaScript consumes the most browser CPU</em>. In addition to median, I looked at the 95th and 99th percentiles for both desktop and mobile, and resized the pie charts based on total time. Here they are overlaid on top of each other:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/cpu-all-blue.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>In addition to being beautiful, this graphic shows an important trend: as browser CPU time grows the percentage used by JavaScript also increases. Ten years ago the network was the main bottleneck. Today, the main bottleneck is JavaScript. The amount of JavaScript on pages is growing rapidly (nearly <a href="/blog/javascript-growth/">5x in the last 7 years</a>). In order to keep pages rendering and feeling fast, we need to focus on JavaScript CPU time to reduce blocking the browser main thread. If you're not tracking your site's JavaScript CPU usage, start doing that now. Even better, <a href="https://support.speedcurve.com/get-the-most-out-of-speedcurve/create-performance-budgets-and-set-alerts">setup a performance budget</a> to alert you if (when?) it becomes a problem.</p> Tue, 05 Feb 2019 00:00:00 +1300 New LUX metrics https://speedcurve.com/blog/new-lux-metrics <p>Over the winter holiday we added a bunch of new metrics to LUX:</p> <ul> <li>First Contentful Paint</li> <li>First CPU Idle</li> <li>Longest Long Task</li> <li>Number of Long Tasks</li> <li>Connection type</li> <li>HTML transfer size</li> <li>Total # of image requests</li> </ul> <p><img class="blog-img" src="https://img.speedcurve.com/blog/New-LUX-metrics2.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p><p>We think it's important to focus on the user experience which translates into when content is rendered to the page. We added&nbsp;<strong>First Contentful Paint</strong>&nbsp;to provide more visibility into rendering. First Contentful Paint and Start Render (which was already available in LUX) are provided by browsers as part of the <a href="https://www.w3.org/TR/paint-timing/#first-contentful-paint">Paint Timing spec</a>. It's the time at which users can start consuming page content. Specifically, it is "the time when the browser first rendered any text, image (including background images), non-white canvas or SVG." This can be found in the LUX Performance dashboard.</p> <p>When it comes to creating a fast, joyous user experience, it's important to understand when the browser is blocked from rendering and accepting user input because the CPU is pegged. The <a href="https://www.w3.org/TR/longtasks/">Long Tasks API</a> allows us to measure when JavaScript blocks the browser main thread for more than 50 milliseconds. In addition to viewing the total time of all Long Tasks, you can now see the <strong>longest Long Task</strong>&nbsp;and the <strong>median Long Task</strong>. You can see all these Long Task and CPU metrics in the LUX Performance dashboard.</p> <p>The <a href="https://developers.google.com/web/tools/lighthouse/audits/first-cpu-idle">Chrome team</a> aggregates the Long Task data into a metric called <strong>First CPU Idle</strong>. It's<span style="color: #565867; font-family: proxima-nova, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 17px;">&nbsp;the first span of 5 seconds where the browser main thread is never blocked for more than 50ms after First Contentful Paint. When your site reaches First CPU Idle it's an indication that rendering isn't blocked and the user can interact without experiencing jank, so it's important to keep this metric as low as possible. You can also find this metric in the LUX Performance dashboard.</span></p> <p><span style="color: #565867; font-family: proxima-nova, Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 17px;">Segmenting real users by <strong>connection type</strong> lets you see what type of bandwidth your users have and how that correlates to performance. LUX gets this data from the <a href="http://wicg.github.io/netinfo/">Network Information API</a>. LUX typically reports the <a href="http://wicg.github.io/netinfo/#effective-connection-types"><em>effective connection type</em></a>, which is calculated based on roundtrip network times and&nbsp;recently observed download times. A breakdown of your users based on connection type is available in the LUX Users dashboard, alongside existing regional, browser, and page breakdowns.</span></span></p> <p><span style="color: #565867; font-family: proxima-nova, Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 17px;">Finally, we had a customer request the <strong>transfer size of the main HTML document</strong>&nbsp;as a new metric, so we added that to the Favorites chart editor. We already reported the number of images above-the-fold, but added the <strong>total number of images</strong>. Viewing these metrics in the LUX Design dashboard allows you to see if lazy loading images below-the fold would help improve performance and reduce data costs.&nbsp;</span></span></p> <p><span style="color: #565867; font-family: proxima-nova, Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="font-size: 17px;">If you're already a LUX customer, take a look at these new metrics. If you're not a LUX customer, <a href="/">signup now</a>&nbsp;to start a free trial.</span></span></p> <p>&nbsp;</p> <p>&nbsp;</p> <p><span style="color: #565867; font-family: proxima-nova, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 17px;">&nbsp;</span></p> <p>&nbsp;</p> Wed, 23 Jan 2019 00:00:00 +1300 Preload scripts https://speedcurve.com/blog/preload-scripts <p>In my previous post I talked about how <a href="/blog/load-scripts-async/">loading scripts asynchronously</a>&nbsp;reduces the impact of JavaScript resulting in a (much) faster user experience. But even when scripts are loaded async, the browser may still twiddle its thumbs for a second or more waiting for the first script to arrive. This delay can be decreased by using <a href="https://w3c.github.io/preload/#x2.link-type-preload">link rel=preload</a>&nbsp;like this:</p> <pre style="font-size: 1.2em; padding-left: 30px;">&lt;link rel="preload" href="main.js" as="script"&gt;</pre><p>Link rel=preload is useful for downloading any important resource more quickly, such as stylesheets that contain critical CSS, fonts that are used in important design elements, and hero images. It's especially important for scripts because they block page content from rendering and consume the most CPU during page load. (We'll explore this topic in the next post in this series.)</p> <p>Including the <code>as</code> attribute is&nbsp;critical. The browser uses this value when determining the download priority. Possible values included script, style, font, image, video, audio, and <a href="https://w3c.github.io/preload/#as-attribute">more</a>. Only use preload for truly critical content, otherwise less important content will consume bandwidth and CPU that would have been better allocated to what matters most. In the case of scripts, link rel=preload is best for the first few synchronous scripts in the page.</p> <p>Link rel=preload has been around for awhile, but is lesser known in the dev community. Nevertheless, <a href="https://www.chromestatus.com/metrics/feature/timeline/popularity/901">Chrome</a> reports that 25% of web pages visited using Chrome have this feature.&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/link-rel-preload.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>While true, this might overstate the adoption of link rel=preload where it matters most. Instead of including all uses of link rel=preload, I did <a href="https://discuss.httparchive.org/t/resource-hints-adoption/1461/8?u=stevesoudersorg">an analysis based on HTTP Archive data</a> to see how many sites use link rel=preload to download scripts for their page. That number turned out to be closer to 1% (12,469 pages out of 1,255,904). This visualization helps make my point:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/link-rel-preload-ha.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>The browser has a built-in <a href="/blog/load-scripts-async/">Preloader</a> which helps get scripts downloading sooner. Using link rel=preload in the markup might accelerate that even more, depending on the structure of your HTML document. It's likely to have a bigger impact, however, if you serve it as an HTTP response header, like this:</p> <pre style="font-size: 1.2em; padding-left: 30px;">Link: &lt;main.js&gt;; rel="preload";&nbsp;as="script"</pre> <p>This HTTP response header is received by the browser before the HTML, so could initiate the script request even sooner. It's best to do both the HTTP response header and the markup as some browsers don't yet support link rel=preload response headers.</p> <p>We know that synchronous scripts block rendering, which makes the user experience feel slow. And we know that <a href="/blog/load-scripts-async/">most scripts today are downloaded synchronously</a>&nbsp;(rather than async). And yet only 1% of sites are using link rel=preload to download their scripts. If your site has any synchronous scripts, do an A/B test adding link rel=preload for them. It's likely this will be a win and help you create a more joyous experience for your users.</p> Tue, 22 Jan 2019 00:00:00 +1300 Load scripts async https://speedcurve.com/blog/load-scripts-async <p>This blog post has a simple conclusion: <em>Load script asynchronously!</em>&nbsp;Simple, and yet the reality is that most scripts are still loaded synchronously. Understanding the importance of loading scripts asynchronously might help increase adoption of this critical performance improvement, so we're going to walk through the evolution of async script loading starting way back in 2007. Here's what loading 14 scripts looked like in Internet Explorer 7:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/ie7-waterfall.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="IE7 Waterfall" /></p><p>I've added a red arrow at the beginning of each script request. What we see is that the HTML parser stops when it encounters a <code>SCRIPT</code> tag until that script is downloaded, parsed, and executed. Because the HTML parser stopped, all network traffic also stopped (because no other HTML tags were parsed to initiate HTTP requests). It wasn't just IE7 that did this - all browsers behaved this way back then.</p> <h3>Enter the Preloader</h3> <p>While it's necessary that scripts get executed in the order specified, there's no reason they can't be downloaded in parallel so that the execution daisy chain moves more quickly. To achieve this, browsers created a lightweight parser called the <a href="https://www.stevesouders.com/blog/2013/11/07/prebrowsing/"><em>preloader</em></a>. The preloader (AKA, speculative or lookahead parser) skims over the HTML looking for tags that might initiate HTTP requests, like <code>SCRIPT</code>, <code>LINK</code>, and <code>IMG</code>. It prioritizes and initiates those requests so that the responses are more likely to be ready when the HTML parser actually creates the corresponding DOM elements.</p> <p>Here's a site with 15 synchronous scripts (also primarily from turner.com). Instead of taking 6 seconds like it did in IE7 with one-at-a-time script downloading, the preloader helps get these scripts downloaded in ~1.2 seconds. (Notes about this waterfall chart: The rendering filmstrip is shown at the top.&nbsp;The browser CPU timeline is shown below the waterfall.&nbsp;Scripts are shown in orange. Synchronous scripts are shown with a red hash pattern. The red and green bars to the right of each script are when the script uses the CPU. Total CPU time for each script is shown in parentheses after the URL.)</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/turner-com-waterfall3.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>The preloader is the most important performance improvement browsers ever made. IE8 was the first browser to have a preloader in 2009. Most of the other major browsers followed suit within the year.&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/preloader-timeline.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>While the preloader dramatically improved web performance, it wasn't a panacea. Looking at the previous waterfall, we see that:</p> <ul> <li>Rendering is blocked until all the synchronous scripts are done downloading, parsing, and executing. If they were downloaded asynchronously, the browser could start rendering sooner.&nbsp;</li> <li>The second script, <code>jquery.js</code>, takes a long time to download. Because it's loaded synchronously, all the subsequent scripts have to wait to be executed, even though they finish downloading before <code>jquery.js</code>. This results in the browser CPU being idle for the first 1.2 seconds and then being pegged when all the JS and layout happens. If the scripts were downloaded asynchronously, they could be parsed and executing immediately when they arrive spreading out the CPU activity which would avoid blocking the CPU.</li> <li>The preloader gives synchronous scripts a higher download priority than images. Since the synchronous scripts take so long to download, the image requests are blocked and the initial rendering only includes text. If the scripts were loaded asynchronously, images would get downloaded sooner providing a better user experience.</li> </ul> <h3>Finally: Async</h3> <p>Looking at the previous waterfall, we see that the preloader dramatically improved performance and rendering. However, it didn't solve all the problems. That page has 15 synchronous scripts, which block rendering, peg the CPU, and delay images. The solution to these problems is to load scripts <em>asynchronously</em>.</p> <p>The best way to load scripts asynchronously is to use the <code>async</code>&nbsp;attribute. Browsers added support for this attribute starting with Firefox and Chrome in 2010, followed by Safari and Internet Explorer in 2012. Before these were widely supported, developers could load scripts asynchronously using a variety of <a href="https://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/">techniques (i.e., hacks)</a>. These techniques are still used today for special situations, but it's simpler to use&nbsp;<code>async</code>&nbsp;in markup. It's also better for performance, as the preloader can spot these scripts and get the HTTP requests started sooner than if they are loaded programmatically.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/async-preloader-timeline.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="async timeline" /></p> <p>The benefits of loading scripts asynchronously are highlighted in the following waterfall chart for <code>nytimes.com</code>. Notice that none of the scripts have the red hash pattern that marks a synchronous script, which means all of these 20+ scripts are loaded asynchronously. As a result, the page renders quickly (0.7 seconds) and the script parsing and execution are not blocked - each script is handled as soon as it arrives.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/async-waterfall2.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Async waterfall" /></p> <h3>Async Adoption</h3> <p>It's great that the&nbsp;<code>async</code>&nbsp;attribute is available and well known, but synchronous script loading is still the default. In other words, website owners need to make an extra effort to get their scripts to load asynchronously. It might not be a lot of work (just add the&nbsp;<code>async</code>&nbsp;attribute) but even small changes can take a long time to reach critical mass on the Web.&nbsp;</p> <p>The chart below shows the adoption of asynchronous script loading. These are median stats from the world's top ~500K websites based on an analysis from the <a href="https://discuss.httparchive.org/t/adoption-of-async-script-loading/1534">HTTP Archive</a>. In late 2015, the median was 10 synchronous scripts and 2 asynchronous scripts. The number of sync dropped and async rose in June 2016. This is likely when some dominant third party snippets (Google Analytics, Facebook, etc.) switched from sync to async. The total number of scripts has continued to climb since then, but all the new scripts use async, which is a great sign. Nevertheless, the most recent data shows that synchronous scripts outnumber asynchronous scripts 7 to 6.&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/async-adoption.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>This growth in the number of scripts loaded asynchronously is impressive. Three years is a long time, but we're talking about half-a-million websites. While the change to make synchronous scripts be asynchronous is trivial (just add the&nbsp;<code>async</code>&nbsp;attribute), making sure that change doesn't produce errors can be challenging. If JavaScript is parsed and executed out-of-order, undefined symbol errors are likely. Untangling the interdependencies to ensure safe async script loading may take time, but the performance benefits are worth it, for you and your users.</p> Thu, 20 Dec 2018 00:00:00 +1300 Trend metrics and compare time periods https://speedcurve.com/blog/trend-metrics-and-compare-time-periods <p>The Internet really is a complicated <a href="https://www.youtube.com/watch?v=f99PcP0aFNE">series of tubes</a>. As a result, any time-based metrics we capture can have variations as those tubes wobble a bit as we shove data down them. To help reduce that variation, when we do synthetic tests, we always load a page at least three times and take the median result. But even then you'll find that, over time, your charts will still show plenty of variation.</p> <p>All that variation can make it difficult to see if your metrics are getting better or worse over time.&nbsp;We recently released a couple of new features in your <a href="/features/synthetic/">Synthetic</a> and <a href="/features/lux/">LUX</a> charts that make it easier for you to visualize trends and compare discrete time periods within your historical data.</p> <h2>Highlight trends in your metrics</h2> <p>To make it easier for you to see which direction your metrics are heading, we've added an option to all your charts to show a trend line which helps you visualize how a particular metric is changing over the timespan of the chart. You can hover over the legend to highlight a trend line or hover over any point on the trend to see the estimated value at that point.</p> <p><img class="blog-img" src="https://assets.speedcurve.com/img/blog/trend.gif" alt="Trends" /></p><h2>Compare time periods</h2> <p>There's really only one question that always needs answering when discussing web performance:</p> <blockquote> <p>Are we getting faster or slower?</p> </blockquote> <p>Our new 'compare' mode helps answer that question and shows just how much things have improved or regressed over the most recent time period compared to the previous one. Things to try:</p> <ul> <li>Pick a day of <a href="/features/lux/">real user traffic</a> before and after the release of a new version of your site.</li> <li>Track your month-to-month progress on a project, such as refactoring your Javascript.</li> <li>Keep a watchful eye on third-party metrics. Review and compare them each month to make sure you're not regressing.</li> </ul> <p>I like to think of this option as <strong>boss mode.</strong>&nbsp;Take these charts to show off to your boss all the progress you're making on that new performance project. Or scare the jeepers out of your boss by showing him or her performance regressions... and unlock more budget for new performance optimization projects.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/chart_compare.png?auto=format,compress" alt="Compare time periods" /></p> <p>To turn on compare mode, go to your dashboards and select the length of time you want to compare (7 days, 1 month, etc.). You can also select a custom start/end date. Then turn on "Compare Previous Period".</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/dropdown_compare.png?auto=format,compress" alt="Dropdown compare time periods" /></p> <h2>Get started</h2> <p>If you're already a SpeedCurve user, trend lines and compare mode are available in your charts. We'd love to hear how you've used them, and how they've been helpful!</p> <p>If you're not a SpeedCurve user, why not <a href="/setup/trial/"><strong>give us a try for free</strong></a>?</p> Tue, 18 Dec 2018 00:00:00 +1300 JavaScript growth and third parties https://speedcurve.com/blog/javascript-growth <p>JavaScript is the&nbsp;main cause for making websites slow. Ten years ago it was network bottlenecks, but the growth of JavaScript has outpaced network and CPU improvements on today's devices. In the chart below, based on <a href="https://discuss.httparchive.org/t/js-requests-size-1st-party-vs-3rd-party/1509">an analysis from the HTTP Archive</a>, we see the number of requests has increased for both first and third party JavaScript since 2011.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/perfnow-js-requests-ha.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="JS Requests" /></p><p>The following chart shows the growth in the total size of JavaScript from 2011.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/perfnow-js-size.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="JS Size" /></p> <p>Certainly the amount of JavaScript has increased. Total number of requests went from 9 to 18, and total size increased from 85 KB to 364 KB. (These are medians from the world's top ~1.3 million sites tested on desktop.) It's interesting to see that the size of scripts is growing more rapidly than the number of scripts - we're packing twice as much code into each script compared to 7 years ago.&nbsp;</p> <p>If we look a little further there are some concerning trends when it comes to third parties.</p> <ul> <li>In terms of the number of JavaScript requests, first party has gone up 50% from 4 to 6 requests, whereas third party has increased 140% from 5 to 12 requests.&nbsp;</li> <li>Third party growth in terms of JavaScript size is more alarming. First party JavaScript doubled from 53 KB to 106 KB. Third party JavaScript octupled(!) from 32 KB to 258 KB.&nbsp;</li> <li>Just looking at the amount of JavaScript being served today, third parties are responsible for twice as many requests (12 vs 6) and about two-and-a-half times as many kilobytes (258 KB vs 106 KB).</li> </ul> <p><img class="blog-img" src="https://img.speedcurve.com/blog/JS-third-parties.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>In the early days back in 2010, the amount of first and third party JavaScript&nbsp;was about the same, whereas now third party JavaScript&nbsp;is more than twice that of first party. A possible explanation for this is the greater availability of and reliance on third party JavaScript&nbsp;across the Web.</p> <p>Third party JavaScript is a significant part of today&rsquo;s websites and should be watched closely. If you don&rsquo;t have <a href="https://addyosmani.com/blog/performance-budgets/">performance budgets</a> setup to watch your site&rsquo;s use of third party JavaScript, you should do that now.</p> Tue, 11 Dec 2018 00:00:00 +1300 Metrics from 1M sites https://speedcurve.com/blog/metrics-from-1m-sites <p>The number of performance metrics is large and increases every year. It's important to understand what the different metrics represent and pick metrics that are important for your site. Our <a href="/blog/rendering-metrics/">Evaluating rendering metrics</a> post was a popular (and fun) way to compare and choose rendering metrics. Recently I created this timeline of performance metric medians from the <a href="https://httparchive.org/">HTTP Archive</a> for the world's top ~1.3 million sites:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/perfnow-metrics-desktop.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Desktop metric timeline" /></p><p>Here's the same chart for mobile:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/perfnow-metrics-mobile.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Mobile metric timeline" /></p> <p>People who have worked on web performance won't be surprised by how much slower mobile is. As much as we hear about improvements to mobile networks and CPUs, they're not on par with desktop. And yet, many sites deliver the same amount of content (especially JavaScript) to mobile devices.</p> <p>What catches my eye are the gaps between TTFB and the paint metrics, and between the paint metrics and First CPU Idle. These gaps are caused by JavaScript dominating the browser main thread. This happens after TTFB when all the blocking scripts are executed &ndash; these have to finish before any rendering can happen. The gap between the paint metrics and First CPU Idle is caused by subsequent scripts being executed and JavaScript frameworks building the DOM dynamically.</p> <p>If you're looking for guidelines on where your metrics should be, these timelines provide a useful guide. Stay tuned for more posts that explore how to make JavaScript faster so it's no longer the longest pole in the tent (or at least shorten the pole).&nbsp;</p> <p><strong>Related posts:</strong></p> <ul> <li><a href="/blog/your-javascript-hurts/">Ouch, your JavaScript hurts!</a></li> <li><a href="/blog/an-analysis-of-chromiums-paint-timing-metrics/">An analysis of Chromium's paint timing metrics</a></li> <li><a href="/blog/rendering-metrics/">Evaluating rendering metrics</a></li> </ul> Tue, 04 Dec 2018 00:00:00 +1300 Deeper performance analysis with histograms and correlations https://speedcurve.com/blog/deeper-web-performance-analysis-histograms-correlations <p>This week we've made some pretty exciting new changes to your Favorites dashboards. Aside from a brand-new chart editor interface, you'll also notice that we've introduced two new chart types: <strong>histograms</strong> and <strong>correlations</strong>.</p> <p>In this post, I'm going to talk through some of the features in our new chart editor. I'll also explain in detail explain why I think histograms are such an important tool in your performance toolkit, and how you can get some fascinating insights by correlating other metrics on top of a histogram.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Screenshot_2018-11-26 Favorites 5 0 Performance Favorites SpeedCurve(12).png" alt="" /></p><h3>Histograms are useful for painting a more detailed picture of your performance, because they show you the distribution of a metric's value.</h3> <p>But what exactly is a distribution? In the chart above, the numbers along the X-axis show the start render time (in seconds), and the height of the bars shows how many page views had that start render time. This shows us that mobile users (blue) pretty consistently have a start render time of between 0.8 and 1.4 seconds.</p> <p>Desktop users (yellow) on the other hand have an extremely varied experience, with start render times anywhere from 0.4 to 2.0 seconds and above.</p> <p>This illustrates one of the ways histograms are so helpful: medians by themselves simply don't convey this depth of information.</p> <h3>To make your charts even more insightful, we also give you the option to correlate one or more metrics over top of a histogram.</h3> <p>In the chart below we plot the bounce rate for a website's home page against a distribution of the page load time. What it shows is that as the page load increases, so does the bounce rate. Faster pages mean fewer bounces!</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Screenshot_2018-11-28 Desktop Backend Favorites SpeedCurve(1).png" /></p> <h3>Correlations are also useful for narrowing down the cause of slow page load times.</h3> <p>For example, in the next chart we can see that a higher page load time correlates to more JavaScript and CSS being loaded in the page. This might indicate that reducing the amount of JavaScript and CSS would have an impact on page load times.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Screenshot_2018-11-28 Disneylandparis Favorites SpeedCurve.png" alt="" /></p> <p>These are just a few examples of the kinds of things you can learn from creating histograms and correlation charts. We're really looking forward to seeing what sort of insights you can gain from these new charts!</p> <h2>New chart editor</h2> <p>As well as the new chart types, we've also developed a brand-new chart editor. What we like the most about this editor is the live preview, which makes it super easy to visualize changes to your charts as you make them.</p> <p><img class="blog-img" src="/img/blog/Peek%202018-11-28%2015-24.gif" /></p> <p>If you're a LUX customer, you'll also notice that you can now add multiple customer data filters. This allows you to dive much deeper into your real user data.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Screenshot_2018-11-22 SpeedCurve Favorites SpeedCurve(1).png" /></p> <h2>Getting started</h2> <p>These improvements are already available for all SpeedCurve customers. Open up one of your Favorites dashboards and create or edit a chart to see the new features in action.</p> <p>Need a refresher? No problem! We have a short tutorial that walks you through the process of <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts">creating custom dashboards and charts</a>.</p> <p><strong>If you&rsquo;re not a SpeedCurve user</strong>:&nbsp;<a href="/plan/trial/">Sign up for your free trial</a> and see what sort of performance insights you can gain!</p> Wed, 28 Nov 2018 00:00:00 +1300 An analysis of Chromium's paint timing metrics https://speedcurve.com/blog/an-analysis-of-chromiums-paint-timing-metrics <p>Here at SpeedCurve, we are continually gathering detailed performance data from tens of thousands of web pages. This gives us a relatively unique opportunity to analyse and aggregate performance metrics to gain some interesting insights. In this post, I'm going to analyse some browser-based paint timing metrics: First Paint &amp; First Contentful Paint (defined in the <a href="https://w3c.github.io/paint-timing/">Paint Timing spec</a> and implemented in Chromium). I'm also going to analyse First Meaningful Paint (defined in <a href="https://docs.google.com/document/d/1BR94tJdZLsin5poeet0XoTW60M0SjvOJQttKT-JK8HI/view">a draft spec</a> and implemented as a Chromium trace metric).</p> <h2>What are paint timing metrics?</h2> <p>The aim of almost any performance optimisation on the web is to improve the user experience. The folk at Google have been pushing this sentiment with a focus on <a href="https://developers.google.com/web/fundamentals/performance/user-centric-performance-metrics">user-centric performance metrics</a>, which aim to answer four questions about users&rsquo; experiences:</p> <ol> <li><strong>Is it happening?</strong> Is the page that I want to see actually loading?</li> <li><strong>Is it useful?</strong> Has enough content rendered that I can engage with it?</li> <li><strong>Is it usable?</strong> Can I scroll and interact with the page, or is it still loading?</li> <li><strong>Is it delightful?</strong> Are my interactions with the page smooth?</li> </ol> <p>First Paint (FP) measures the point at which pixels are first rendered to the screen after navigating to a new page. First Contentful Paint (FCP) is slightly more specific, in that it measures the point at which <strong>text</strong> or <strong>graphics</strong> are first rendered to the screen. Both of these metrics are available in Chromium browsers (Chrome, Opera, Samsung Internet, etc) via the Performance API: <code>performance.getEntriesByType('paint')</code>.</p> <p>The paint timing metrics are important because they aim to answer the first question: <strong>is it happening?</strong> My analysis will look at performance data from some popular websites in an attempt to figure out whether the paint timing metrics really do answer that question.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/paint-timing-metrics-dist-seconds.png?auto=format&amp;fit=clamp&amp;max-w=1000" /></p><h2>What makes a metric useful?</h2> <p>If paint timing metrics accurately reflect users&rsquo; experiences, then we can use that information in real user monitoring (RUM) to gain insights into how web pages perform in the real world. Since these metrics are supposed to answer the question <em>is it happening?</em> then doesn&rsquo;t that make them useful by default? Well, maybe not. There&rsquo;s <a href="https://w3c.github.io/paint-timing/#sec-terminology">an important caveat</a> that is mentioned in the Paint Timing spec:</p> <blockquote> <p>The rendering pipeline is very complex, and the timestamp should be the latest timestamp the browser is able to note in this pipeline (best effort). Typically <strong>the time at which the frame is submitted to the OS for display</strong> is recommended for this API.</p> </blockquote> <p>Even once the operating system gets hold of a frame, there can be a noticeable delay before that frame is actually rendered to the screen. So when we use a browser&rsquo;s paint metrics, we have to deal with the possibility that they do not accurately represent when a user actually sees anything on their screen.</p> <p>It just so happens that we can test the accuracy of the paint timing metrics by comparing them to the <strong>Start Render</strong> metric in <a href="https://www.webpagetest.org/">WebPageTest</a>. WebPageTest loads a web page in a real web browser and captures a video of the screen as the page loads. It calculates the Start Render time by performing a frame-by-frame comparison to find the point at which the first pixels are rendered to the screen. This means that Start Render represents when a user would actually see the pixels, accurate to within 16.6667ms (the frame duration for a video captured at 60 fps).</p> <p>Before I continue, it's important to note that while First Paint is analogous to Start Render, First Contentful Paint by definition is not. However, I&rsquo;ve chosen to include FCP in this analysis anyway, because I think the data is quite interesting.</p> <h2>Doing the analysis</h2> <p>Under the hood, SpeedCurve uses WebPageTest to run performance tests, which means we have access to plenty of data that will enable us to compare the browser's paint metrics to WebPageTest's Start Render. I collated data from one of our test accounts that routinely runs performance tests on 40 of the Alexa top sites, and performed some basic statistical analysis on it. This data, along with the code that I used to perform the analysis are both <a href="https://github.com/wildlyinaccurate/paint-metrics-analysis">available on GitHub</a>.</p> <p>The main question I have about the paint metrics is <strong>how much do they differ from </strong><strong>Start Render?</strong> To answer this, I calculated how different First Paint and First Contentful Paint are from Start Render in every test result (<code>FP &minus; SR</code> and <code>FCP &minus; SR</code>) Then I plotted this data as a histogram. Let&rsquo;s take a look.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/paint-timing-metrics-deltas-absolute.png?auto=format&amp;fit=clamp&amp;max-w=1000" /></p> <p>In case you're not familiar with histograms, here's how you can interpret this chart:</p> <ul> <li>The X-Axis is how many milliseconds different each metric is to Start Render. A negative value means that the metric occurred <em>before</em> Start Render. Each bar on the X-Axis is a 20ms bucket.</li> <li>The Y-Axis is the number of tests whose metric falls into each bucket. For example there are 372 tests for which First Contentful Paint happened between -40ms and -21ms before Start Render.</li> </ul> <p>The first thing I notice about this histogram is how it shows that more often than not, the paint timing metrics occur before Start Render. To put this another way:&nbsp;more often than not,<strong> FP and FCP are recorded before anything is rendered to the screen</strong>. That's an interesting discovery, although it's not entirely unexpected given the "complex rendering pipeline" caveat.</p> <p>We can extract some human-friendly conclusions from this data by calculating some percentiles:</p> <ul> <li>95% of FP and 85% of FCP events occur <strong>before</strong> Start Render.</li> <li>50% of FP and FCP events occur <strong>within 90ms</strong> of Start Render.</li> <li>80% of FP and FCP events occur <strong>within 200ms</strong> of Start Render.</li> </ul> <p>Since this data comes from pages with varying load times, it might be more useful to view the deltas as a percentage of Start Render time:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/paint-timing-metrics-deltas-relative.png?auto=format&amp;fit=clamp&amp;max-w=1000" /></p> <p>The shape of the histogram hasn't changed too much, but this time we have a slightly more useful scale and we can see that in most cases the paint timing metrics occur within 10% of Start Render. Some human-friendly conclusions from this data:</p> <ul> <li>50% of FP and FCP events occur within <strong>4%</strong> of Start Render.</li> <li>80% of FP and FCP events occur within <strong>10%</strong> of Start Render.</li> </ul> <p>Put in this context, the difference between the paint timing metrics and Start Render seems much more reasonable.</p> <h2>What to make of these numbers?</h2> <p>If we can accept that 10% is a reasonable margin of error, then this data tells us that 80% of FP and FCP times are a <em>reasonably</em> accurate representation of when the first pixels are rendered to the user's screen.</p> <p><strong>What about the remaining 20% of page loads?</strong></p> <p>The FP values that fall outside of our 10% margin of error are all <em>before</em> the Start Render time, which means that they represent a point in time when the screen is still blank. The outlying FCP values, on the other hand, are mostly <em>after</em> the Start Render time. I would guess this is where the <em>contentful</em> part of First Contentful Paint is having a positive effect. While these outliers don&rsquo;t represent the first render, they at least represent a point in time where <em>something</em> has been rendered. It feels like this difference makes FCP a slightly more useful metric than FP, at least for representing when users see the first render on their screens.</p> <h2>What about First Meaningful Paint?</h2> <p>I said that I would also analyse First Meaningful Paint. Just like First Contentful Paint, FMP is intended to be a fundamentally different metric to Start Render. The "meaningful" part of First Meaningful Paint comes from a set of heuristics like the number of layout objects, page height, and web fonts. You would therefore expect FMP to occur much later than Start Render. Let's take a look at a histogram of the difference between Start Render and FP, FCP, and FMP.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/paint-timing-metrics-with-fmp-deltas-relative.png?auto=format&amp;fit=clamp&amp;max-w=1000" /></p> <p>Somewhat surprisingly, FMP suffers from the same problem as the other two metrics in that it regularly occurs before Start Render. Thanks to its more advanced heuristics, FMP is much more likely to represent a point in time when there are actually pixels on the screen. There is one interesting human-readable conclusion that comes out of this data:</p> <ul> <li>50% of FMP events occur <strong>before</strong> Start Render.</li> </ul> <h2>Key findings</h2> <p>There are a few key findings that stand out from this analysis:</p> <ol> <li>Paint timing metrics are too optimistic. In 85-95% of cases, they are recorded before any pixels are actually rendered to the screen.</li> <li>First Meaningful Paint, while being an improvement over the other metrics, still suffers from the "complex rendering pipeline" issue, and half of all FMP events occur before any pixels have actually been rendered to the screen.</li> <li>If you want a metric that truly represents what users are seeing on their screens, you are limited to synthetic testing tools like WebPageTest that capture a video of the screen as the page is being loaded. For real user monitoring (RUM), you are probably still better off using <a href="/blog/user-timing-and-custom-metrics/">your own custom metrics</a> to measure the most meaningful parts of your page load.</li> </ol> <p>As a final disclaimer: it&rsquo;s important to keep in mind that I analysed a small amount of data from a small sample of web pages. Modern web pages are extremely complex and very rarely do two pages render in the same way. You should always use data from your own web pages to decide which metrics best represent the experience of users of your pages.</p> Wed, 26 Sep 2018 00:00:00 +1200 Performance improvement checklist for your whole site https://speedcurve.com/blog/performance-improvement-checklist <p><code></code>One of the longest-standing items on my performance monitoring tool wishlist is an automatically-generated <strong>performance improvement checklist</strong>, with the improvements ordered by the impact that they will have on the website. In a previous life, I spent countless hours writing performance reports and <a href="https://wildlyinaccurate.com/using-ab-testing-to-prioritise-performance-optimisations/">conducting A/B performance tests</a> to figure out which change would have the biggest impact on a website's performance.</p> <p>So I'm understandably very excited that today we're announcing the new Improve dashboard &ndash; a prioritised performance improvement checklist that aggregates Lighthouse and Google PageSpeed results across all the URLs in your site to identify the most impactful performance changes you can make.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/improve-dashboard.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p><h2>Why we created the Improve dashboard</h2> <p>Since we added the ability to <a href="/blog/lighthouse-scores-now-available/">view Lighthouse scores in your test results</a>, we realised that there needs to be an easier way to view these scores as an aggregate across all of your tests. While you could already plot the average scores in your Favorites charts, there wasn't a way to aggregate the individual audits that make up these scores &ndash; until now.</p> <p>The Improve dashboard combines the Lighthouse and PageSpeed audits for all of your latest test results, and shows you how each audit affects your different URLs.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/improve-audit-detail.png?auto=format&amp;fit=clamp&amp;max-w=1000" /></p> <h2>How to use it</h2> <p>The Improve dashboard is available in the global left-hand navbar. The UI should look relatively familiar &ndash; it's the same UI that we use to display Lighthouse and PageSpeed scores on the test results page. Along the top you'll see the <strong>average scores</strong> across all of the URLs in your site.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/improve-dashboard.png?auto=format&amp;fit=clamp&amp;max-w=1000" /></p> <p>Below the score gauges, you'll see the individual audits for the selected score. To help you identify which audits are the most important, we give you a few ways to order them:</p> <h3>Order audits by their impact score</h3> <p>Audits can be ordered by their impact score, which is the average impact score across all of the URLs that are affected by the audit. This is the default audit order, because it helps you pick out which changes are deemed most important by Lighthouse or PageSpeed.</p> <h3>Order audits by how many URLs they affect</h3> <p>You can also order audits by their <em>Synthetic Impact</em>, which is calculated as the percentage of your SpeedCurve URLs that are affected by each audit. This enables you to quickly pick out the performance improvements that will affect the greatest number of your pages.</p> <h3>Order audits by RUM page views</h3> <p>LUX is SpeedCurve's Real User Monitoring (RUM) product. If you're a <a href="/features/lux/">LUX customer</a>, you can order audits by their <em>LUX Impact</em>. This is calculated as the percentage of your LUX page views that the audited URLs account for. We're especially excited about this feature, because it enables you to <strong>pick out the audits that have the biggest impact on your users in the real world</strong>.</p> <h2>Don't forget about performance budgets!</h2> <p>Now is a great time to remind you that you can also set performance budgets on your aggregate Lighthouse scores. This is an ideal way to keep track of your scores and be notified when one of your pages brings the average score for your entire site down.</p> <p>If you want a hand with setting up some performance budgets, check out <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-performance-budgets-and-set-alerts">our support article</a>.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/improve-lighthouse-budget.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" /></p> <h2>Getting started</h2> <p>We're really looking forward to seeing how you use the Improve dashboard to drive your day-to-day performance work. If you're a SpeedCurve user, you can dive in and start using this dashboard straight away. If you're not already a SpeedCurve user, we'd love to have you <a href="/setup/trial/"><strong>give us a try for free</strong></a>!</p> Thu, 09 Aug 2018 00:00:00 +1200 Lighthouse scores now available in your test results https://speedcurve.com/blog/lighthouse-scores-now-available <p>In the year since Google rolled out Lighthouse, it's safe to say that "Will you be adding Lighthouse scoring?" is one the most common questions we've fielded here at SpeedCurve HQ. And since Google cranked up the pressure on sites to deliver better mobile performance (or suffer the SEO consequences) <a href="https://webmasters.googleblog.com/2018/01/using-page-speed-in-mobile-search.html" target="_blank" rel="noopener">earlier this month</a>, we've been getting that question even more often.</p> <p>We take a rigorous approach to adding new metrics. We think the best solution is always to give you the right data, not just more data. So we're very happy to announce that after much analysis and consideration, we've added Lighthouse scores to SpeedCurve. Here's why &ndash; as well as how you can see your scores if you're already a SpeedCurve user.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Lighthouse-1.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p><h2>Why we added Lighthouse to SpeedCurve</h2> <p><a href="https://developers.google.com/web/tools/lighthouse/" target="_blank" rel="noopener">Lighthouse</a> is an open-source automated tool for auditing the quality of web pages. You can perform Lighthouse tests on any web page, and get a series of scores for performance, accessibility, SEO, and more.</p> <p>You can run Lighthouse within Chrome DevTools, from the command line, and as a Node module. But there's no need to do any of those if you're already using <a href="/features/synthetic/">SpeedCurve Synthetic monitoring</a>. Every time you run a synthetic test, your Lighthouse scores appear at the top of your test results page by default.&nbsp;</p> <p>There were a number of compelling reasons why we made the choice to add Lighthouse to SpeedCurve:</p> <h3>Track metrics that correlate to UX</h3> <p>The best performance metrics are those that help you <a href="/blog/rendering-metrics/">understand how people experience your site</a>. One of the things we like about Lighthouse is that &ndash; like SpeedCurve &ndash; it tracks user-oriented metrics like Speed Index, First Meaningful Paint, and Time to Interactive.&nbsp;</p> <p><span style="font-size: 24px;">See all your improvement recommendations in one place</span></p> <p>SpeedCurve already gives you <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/find-and-fix-performance-issues-on-your-pages">performance recommendations on your test results pages</a>. Now you can get all your recommendations &ndash; including those for accessibility and SEO &ndash; on the same page. Because we also include your PageSpeed score, SpeedCurve is the only place where you can get your Lighthouse audits and your PageSpeed Insights under one roof.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Lighthouse-6.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h3>Improve SEO, especially for mobile</h3> <p>Several of our customers have told us that their SEO teams are very interested in using Lighthouse to help them feel their way forward now that&nbsp;<a href="https://webmasters.googleblog.com/2018/01/using-page-speed-in-mobile-search.html">Google has announced that page speed is a ranking factor for mobile search</a>.&nbsp;</p> <h3>Monitor unicorn metric for CEOs and executives</h3> <p>When Google talks, executives listen. Many of our customers have told us that their CEO or other C-level folks don't really care about individual metrics. They want a single aggregated score &ndash; a unicorn metric &ndash; that's easy to digest and to track over time.&nbsp;</p> <h3>Get alerts when your Lighthouse scores "fail"</h3> <p>One of the great things about running your Lighthouse tests within SpeedCurve is that you can use your Favorites dashboard to <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts">create custom charts</a> that let you track each Lighthouse metric. You can also <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-performance-budgets-and-set-alerts">create performance budgets</a> for the metrics you (or your executive team) care about most and get alerts when that budget goes out of bounds.</p> <p>For example, the custom chart below tracks three Lighthouse scores &ndash; performance, accessibility, and SEO &ndash; for the Amazon.com home page. I've also created a (very modest) performance budget of 50 out of 100 for the Lighthouse Performance score. That budget is tracked in the same chart, and you can see that the budget has gone out of bounds a couple of times in the week since we activated Lighthouse. You can also see, interestingly, that this score has much more variability than the other scores. This would merit some deeper digging.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/Lighthouse-5.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Get started</h2> <p>If you're already a SpeedCurve user, you can <a href="http://support.speedcurve.com/synthetic-settings/see-your-detailed-historic-synthetic-test-results">drill down into your individual test results</a>&nbsp;and find your Lighthouse scores at the top of the page. We activated Lighthouse about a week ago, so you'll find a week's worth of test data to explore.</p> <p>If you're not a SpeedCurve user, you can&nbsp;<a href="/setup/trial/">sign up for a free trial</a> and check out your Lighthouse scores and the dozens of other performance and UX metrics we track for you.&nbsp;</p> <h2>As always, we love your feedback!</h2> <p>I'd especially love to hear what your experience has been with Lighthouse. Are you using it to help with something not covered in this post? Have you learned something with Lighthouse that might otherwise have eluded you? Let me know in the comments!</p> Wed, 25 Jul 2018 00:00:00 +1200 Ouch, your JavaScript hurts! https://speedcurve.com/blog/your-javascript-hurts <p>When looking to improve the performance and user experience of our sites we often start by looking at the network:</p> <p style="padding-left: 30px;"><em>What's the time to first byte?<br /></em><em>How many requests are we making and how long are they taking?<br />What's blocking the browser from rendering my precious pixels?</em></p> <p>While these are entirely valid questions, over the last few years we've seen a growing number of web performance issues that are caused, not by the network, but by the browser's main thread getting clogged up by excessive CPU usage.</p><blockquote> <p>When creating great user experiences, managing CPU usage is now just as important as fast networks.</p> </blockquote> <p>How often have you been on your mobile and loaded what looks like a complete page only to discover than when you tap or scroll nothing happens or the page lags far behind your input? We need a fresh set of questions that reflect how congested the CPU on our devices might be and how that affects users:</p> <p style="padding-left: 30px;"><em>How long is the browser's main thread trashing at 100% CPU?</em><br /><em>When can users start interacting smoothly without interruption?&nbsp;<br /></em><em>Which scripts are hurting my users?</em></p> <p>Through the development of new web performance metrics and visualisations, we're now at a point where we can see the true cost of JavaScript, as well as monitor and improve its impact on users.</p> <h2>First Interactive &amp; First Input Delay</h2> <p>These new JavaScript performance metrics capture for the first time just how long users are having to wait before they can smoothly interact with the page:</p> <p><a href="https://github.com/WPO-Foundation/webpagetest/blob/master/docs/Metrics/TimeToInteractive.md">First Interactive</a> is a Synthetic metric that marks the point in time when the browser's main thread is not blocked for more than&nbsp;<strong>50ms</strong>&nbsp;by any single task so it will be able to respond to user input quickly.</p> <p><a href="https://developers.google.com/web/updates/2018/05/first-input-delay">First Input Delay</a> is a RUM metric that we recently <a href="/blog/first-input-delay/">added to LUX</a>. It measures the time from when a user first interacts with your site (i.e. when they click a link or tap on a button) to the time when the browser is actually able to respond to that interaction.</p> <h2>JavaScript Waterfall</h2> <p>One of the challenges with monitoring JavaScript performance is the ability to attribute which scripts are causing issues. To help we're excited to introduce the concept of a JavaScript Waterfall chart that blends the network and execution time of your scripts into a filterable view that lets you quickly focus on the scripts that are causing delays.</p> <p><a href="/speedcurve-enterprise/top-sites/javascript/?b=chrome&amp;d=-1&amp;de=1529927999&amp;ds=1527163200&amp;r=us-west-1&amp;s=20746&amp;u=41453&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3"><img class="blog-img" src="https://img.speedcurve.com/blog/js_waterfall.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="Javascript Waterfall" /></a></p> <p>The Javascript waterfall lets you correlate the user experience (filmstrip up top) with the browser main thread (CPU usage along the bottom) and identify which scripts (middle) are delaying important browser metrics (vertical lines).</p> <p>In the view below, we've filtered on JavaScript activity longer than 50ms (in red). You can see how a bunch of third-party ads have pushed the First Interactive metric right out to 12.74s. In fact, the hero content in the viewport was visible at 3s but because of those third-party ads the page was not considered usable for another 10s! This really highlights the hidden cost of JavaScript and how easily it can lead to a poor user experience.</p> <p><a href="/speedcurve-enterprise/top-sites/javascript/?b=chrome&amp;d=-1&amp;de=1529927999&amp;ds=1527163200&amp;r=us-west-1&amp;s=20746&amp;u=41453&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3"><img class="blog-img" src="https://img.speedcurve.com/blog/js_domains.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p>We also group JavaScript by domain to help bubble up the most problematic consumers of CPU and also trend the CPU time used through to important browser events like start render. You can also set <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-performance-budgets-and-set-alerts">performance budgets</a> on metrics like CPU scripting time to Page Load and receive Slack alerts when your page's JavaScript performance deteriorates.&nbsp;</p> <p><a href="/speedcurve-enterprise/top-sites/javascript/?b=chrome&amp;d=-1&amp;de=1529927999&amp;ds=1527163200&amp;r=us-west-1&amp;s=20746&amp;u=41453&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3"><img class="blog-img" src="https://img.speedcurve.com/blog/js_time.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h2>The cost of JavaScript</h2> <p>At the recent O'Reilly Fluent Conference, Addy Osmani gave an insightful look into <a href="https://www.youtube.com/watch?v=63I-mEuSvGA">The Cost of JavaScript.</a>&nbsp;He really challenged the complacency we often have as developers who work and test on fast devices and fast networks. It's vital we jump on old devices that reflect what average users experience and <a href="http://support.speedcurve.com/synthetic-settings/cpu-throttling-for-mobile-devices">throttle the CPU</a> of our tests. We need to remember that, byte for byte, JavaScript consumes a heck of a lot more CPU than CSS or images and can block our users from interacting with the page.</p> <h2>JS frameworks, friend or foe?&nbsp;&nbsp;</h2> <p>I love the ease of development and the functionality that JavaScript frameworks like <a href="https://reactjs.org/">React</a> and <a href="https://vuejs.org/">Vue.js</a> have enabled over recent years, but often we don't talk about their cost. You don't get anything for free, and there's little discussion when choosing these frameworks about the cost to users. When we push all our app logic and rendering from the server to the client, we become reliant on the device to perform. Often those devices are just not as fast as we expect them to be.</p> <p>Addy <a href="https://youtu.be/63I-mEuSvGA?t=14m4s">highlighted an example</a> of this tradeoff when Netflix moved parts of their website signup and video player from vanilla JavaScript to React. In the initial release they saw a degradation in client side performance and user experience. They ended up removing React from some pages and putting considerable effort into optimising performance of the player to get it back on par with the original.</p> <p>What struck me is that the user experience ended up being the same. So was it worth the effort? And if they hadn't put the extra effort in, would the default React version actually have been worse for users. Are you monitoring metrics like First Interactive to make sure your users don't also suffer?</p> <blockquote> <p>Don't let the development joy of a JavaScript framework blind you to the pain it might cause your users</p> </blockquote> <p>When moving to these JavaScript frameworks, I believe it's critical to keep the user experience in mind and keep asking yourself if this will improve the speed of your website or hinder it. You can use tools like SpeedCurve to <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/ab-performance-testing">A/B test a prototype</a> and quantify the cost of a JavaScript framework before jumping in boots and all.&nbsp;</p> <p><strong>We've set ourselves a new goal at SpeedCurve: to be the best tool for monitoring the performance of JavaScript.</strong> <a href="/setup/trial/">Jump in and explore your own JS waterfall</a> and let us know what else you'd like to see as you dive deeper into the performance of your JavaScript stack.</p> Mon, 25 Jun 2018 00:00:00 +1200 First Input Delay shows how quickly your site responds to user interaction https://speedcurve.com/blog/first-input-delay <p>We're excited to announce the availability of the First Input Delay metric as part of <a href="/features/lux/">LUX</a>, SpeedCurve's RUM product.</p> <p><a href="/webpagetest/lux-perf/?ld=5&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f"><img class="blog-img" src="https://assets.speedcurve.com/img/blog/fid.png" alt="First Input Delay" /></a></p><p><a href="https://developers.google.com/web/updates/2018/05/first-input-delay">First Input Delay</a> (FID) was developed by Google to&nbsp;capture how quickly websites respond to user interaction. It's fairly simple to implement: We add event handlers for click, mousedown, keydown, pointerdown, and touchstart. When the user first interacts with the page in one of those ways, we measure the time between when the event happened and when the event handler was actually called. That delta is FID.</p> <p>For many websites, FID is typically quick. In the <a href="/webpagetest/lux-perf/?ld=5&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">FID chart for WebPageTest</a> (shown above), we see the median FID value is only 3 milliseconds. But the 95th percentile value is 30ms. (Click on the chart to interact with the live dashboard.) That's coming close to the 50ms interval that defines a <a href="https://www.w3.org/TR/longtasks/">Long Task</a>&nbsp;when responsiveness starts feeling sluggish. To help correlate these issues we show the <a href="/webpagetest/lux-perf/?ld=5&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">Long Tasks chart</a> right below the FID chart. Along with FID we show our interaction metrics which reveal how long it takes before the user clicks, keys, or scrolls.&nbsp;</p> <p><img class="blog-img" src="https://assets.speedcurve.com/img/blog/long-tasks.png" alt="Long Tasks" /></p> <p>FID, Long Tasks, and interaction metrics combine to provide insight on how JavaScript on your page hogs the CPU and impacts the user experience. FID is only available in RUM (since synthetic tests don't have users that interact). If you're not already using RUM, start a <a href="/">free trial of LUX</a> to see these metrics from your website.</p> Thu, 14 Jun 2018 00:00:00 +1200 Monitor performance budgets at a glance with your Status dashboard https://speedcurve.com/blog/web-performance-budgets-status-dashboard <p>This may sound counter-intuitive, but <strong>we don't want you to spend countless hours using SpeedCurve</strong>. In fact, our goal is to make your web performance data so accessible, understandable, and actionable that you can get everything you need from us in just a few minutes.</p> <p>That's why we're so excited to announce the brand-new Status dashboard &ndash; a visualization that lets you see at a glance all your web performance budgets, as well as which budgets have been violated.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/status-dashboard.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>Keep reading to find out how to start using your Status dashboard to diagnose and fix your performance pains. But first, let's talk about why we built this feature.</p><h2>Why we created the Status dashboard&nbsp;</h2> <p>TLDR: To make your life easier.</p> <p>We're constantly debating the most important metrics to focus on and the most helpful ways to visualize your data for you. We&nbsp;have decades of collective web performance experience, which translates to a lot of strong opinions. You can see those opinions represented in the default charts in a few of your dashboards. These curated charts are a good way to get started. But they're just the beginning.</p> <p>You know your site and your performance goals better than anyone. That's why last year we launched Favorites dashboards &ndash; where you can <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts" target="_blank" rel="noopener">create your own custom charts</a> and organize them in separate dashboards geared toward different teams and projects. And it's why we recently made it easy for you to <a href="http://support.speedcurve.com/synthetic-settings/performance-budgets" target="_blank" rel="noopener">create your own performance budgets</a> within your Favorites dashboards. (If you're not familiar with web performance budgets and why they're essential, I encourage you to <a href="/blog/performance-budgets-in-action/" target="_blank" rel="noopener">read this post</a>.)&nbsp;</p> <p>Some of our customers have dozens of Favorites dashboards, with dozens of charts on each. Many of our customers have signed up to <a href="http://support.speedcurve.com/synthetic-settings/performance-budgets" target="_blank" rel="noopener">get alerts when your budget thresholds are crossed,</a>&nbsp;as well as&nbsp;<a href="http://support.speedcurve.com/synthetic-settings/generate-weekly-email-reports-from-your-favorites-dashboards" target="_blank" rel="noopener">weekly email reports that summarize the activity of your key metrics</a>. These are all important features, but we wanted to do more. <strong>We wanted to make it even easier for you to see at a glance the status of all your performance budgets so that you can quickly home in on the metrics that are hurting the most.&nbsp;</strong></p> <h2>How to use it</h2> <p>The Status dashboard is available as in your global left-hand navbar. Click on any budget to drill down into each metric.&nbsp;</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/status-dashboard-expand-green.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>You're probably wondering about that red alert, am I right? Of course you are. Below you can see that while the target backend time is 0.25 seconds, the actual backend time is 0.52 seconds. When you expand this metric, you can also see that not only is backend time at least 27% over budget across all segments in this budget, it's been that way for more than 30 days.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/status-dashboard-expand-red.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p>To drill down into the charts for each budget, just click on the link for that metric. That will take you to the detailed time series chart in your Favorites dashboard. You can then click on any point in the series to drill down into the results page for that test:</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/status-dashboard-favorites-chart.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <p><a href="http://support.speedcurve.com/synthetic-settings/see-your-detailed-historic-synthetic-test-results" target="_blank" rel="noopener">Your test results page contains a lot of great information</a>, including suggested performance fixes for that page. Here are the recommendations for the page we've been tracking... and yes, I'm aware that it doesn't relate to back-end time. ;)</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/status-dashboard-test-results.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></p> <h2>Getting started</h2> <p>We're super excited about the Status dashboard and its potential to simplify your daily workflow. If you're a SpeedCurve user, here's how to start taking advantage of it right away:</p> <ol> <li>If you've already created custom charts and assigned performance budgets for them, then your Status dashboard is live right now. Check it out and give us your feedback!</li> <li>If you haven't already done so,&nbsp;<a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts" target="_blank" rel="noopener">create some custom charts</a> within your Favorites dashboard.</li> <li>Within those charts, <a href="http://support.speedcurve.com/synthetic-settings/performance-budgets" target="_blank" rel="noopener">create a performance budget</a> for each chart.</li> <li>Go to your Status dashboard to see at a glance which of your metrics are over and under budget.&nbsp;</li> </ol> <p>If you're not already a SpeedCurve user, we'd love to have you <a href="/setup/trial/"><strong>give us a try for free</strong></a>!</p> Mon, 11 Jun 2018 00:00:00 +1200 Weekly email reports from your SpeedCurve dashboards https://speedcurve.com/blog/weekly-email-reports-from-your-speedcurve-dashboards <p>Part of building a strong performance culture in an organisation is lowering the barrier to getting people excited about performance. One of the most effective ways I've found to do this is to send around a performance report every week that can, at a glance, answer an important question: <em>did performance get better or worse?</em></p> <p>That was the motivation behind our new <strong>Weekly Report</strong> feature. Now you can configure any of your <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts" target="_blank" rel="noopener">Favorites dashboards</a> to be summarized in a weekly email, like this one:</p> <p><img class="blog-img" style="max-width: 850px;" src="https://img.speedcurve.com/blog/speedcurve-weekly-email-sample.png?auto=format&amp;fit=clamp&amp;max-w=850" alt="Weekly report email screenshot" /></p><p>Your weekly report emails are sent out at 9am every Monday (in your time zone) and contain a week-over-week comparison of all of the metrics in the dashboard. You can see at a glance whether things are improving or getting worse.</p> <h2>How to enable your weekly email reports</h2> <p>You can enable weekly emails when you are creating or editing a Favorites dashboard by ticking the <strong>Send this dashboard as a weekly email report</strong> checkbox. You can specify recipients on a per-dashboard basis. This enables you to create dashboards &ndash; and weekly reports &ndash; with different audiences in mind.</p> <p><img class="blog-img" style="max-width: 600px;" src="https://img.speedcurve.com/blog/Screenshot_2018-05-18 Settings SpeedCurve.png?auto=format&amp;fit=clamp&amp;max-w=600" alt="Add Dashboard form with Weekly Email Report section highlighted" /></p> <h2>Questions? Feedback?</h2> <p>As always, we love hearing your feedback on new features! Leave a comment below or send an email to <a href="mailto:support@speedcurve.com">support@speedcurve.com</a> to tell us how you're using the weekly emails, or let us know if you have any suggestions for how to improve them. And if you're not already using SpeedCurve, <a href="/setup/trial/">give us a try for free</a>.</p> <h2>Related:</h2> <ul> <li><a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts">Create custom dashboards and charts in your Favorites</a></li> <li><a href="http://support.speedcurve.com/synthetic-settings/performance-budgets">Set up performance budgets and alerts</a></li> </ul> Fri, 18 May 2018 00:00:00 +1200 Using RUM to track CPU time https://speedcurve.com/blog/cpu-times-for-rum <p>It's exciting working at SpeedCurve and pushing the envelope on performance monitoring to better measure the <em>user's experience</em>. We believe when it comes to web performance it's important to measure what the user sees and experiences when they interact with your site. A big part of our focus on metrics has been around rendering including&nbsp;<a href="/blog/rendering-metrics/">comparing TTI to FMP</a>, <a href="/blog/web-performance-monitoring-hero-times/">Hero Rendering</a>, and <a href="/blog/measuring-blocking-resources/">critical blocking resources</a>.</p> <p>The main bottleneck when it comes to rendering is the browser main thread getting blocked. This is why we launched <a href="/blog/track-down-front-end-cpu-hogs/">CPU charts for synthetic testing</a>&nbsp;over a year ago. Back then it wasn't possible to gather CPU information using real user monitoring (RUM), but the <a href="https://www.w3.org/TR/longtasks/">Long Tasks API</a>&nbsp;changes that. Starting today, you can track how CPU impacts your users with SpeedCurve's RUM product, <a href="/features/lux/">LUX</a>.</p> <p><img class="blog-img" src="https://img.speedcurve.com/blog/lux-cpu2.png?auto=format&amp;fit=clamp&amp;max-w=1000" alt="" /></p><p>We've been tracking and studying Long Tasks data for several months before launching the dashboards today, so if you're a LUX customer, you'll actually have historical data going back to January.</p> <p>For example, the chart above shows <a href="/webpagetest/lux-perf/?ld=30&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">CPU timing for scripts on webpagetest.org</a>. (WebPageTest uses LUX and has generously agreed to share its data.) In this month view, we see four spikes for CPU time. At first we might think the cause is an increase in script size or number of scripts in the page, but the real answer is simply the cycle of weekday traffic from work versus weekend traffic from home.</p> <h2>What is a "long task"?</h2> <p>I summarized my early experiences with the Long Tasks API in my PerfPlanet article&nbsp;<a href="https://calendar.perfplanet.com/2017/tracking-cpu-with-long-tasks-api/">Tracking CPU with Long Tasks API</a>. A "long task" is defined as any process that consumes more than 50ms on the browser main thread.</p> <p>In LUX, we track the sum of the Long Tasks time for each page, and show aggregate metrics in the LUX dashboards. You can filter the data by page, region, and browser. As the Long Tasks API evolves, we'll get attribution information so you can identify which scripts are the real culprits and more information about layout, painting, and other CPU-intensive activities.</p> <h2>Getting started</h2> <p><strong>If you're already using LUX:</strong> Check out the new CPU charts in your LUX Performance dashboard.</p> <p><strong>If you'd like to try LUX:</strong> Sign up for a <a href="/plan/trial/">free trial</a>&nbsp;or <a href="mailto:support@speedcurve.com">contact us</a> and we'll hook you up.</p> Thu, 12 Apr 2018 00:00:00 +1200 Introducing Last Painted Hero https://speedcurve.com/blog/last-painted-hero <p>We're excited to announce that we've launched Last Painted Hero as an official metric. Last Painted Hero is a synthetic metric that shows you when the last piece of critical content is painted.&nbsp;Keep reading to learn how Last Painted Hero works, why (and how) we created it, and how it can help you understand how your users perceive the speed of your pages.</p> <h2>The case for smarter heuristics</h2> <p>When choosing the right performance metric, my soapbox for the last few years has been "not every pixel has the same value". In other words, rather than chase dozens of different performance metrics, focus on the metrics that measure what's critical in your page.</p> <p>Here at SpeedCurve, we think it's good to focus on rendering metrics, because they're a closer approximation to what the user experiences. There are some good rendering metrics out there, like start render and Speed Index, but the downside to these metrics is that they give every pixel the same value. For example, if the background renders and some ads render, that could improve your start render time and Speed Index score, but it might not have a big impact on the user's experience. Instead, it's better to measure the parts of the page that matter the most to users. We call those parts of the page the "hero elements".</p><p>Measuring hero elements sounds logical, but deploying metrics that do this is difficult. It's especially difficult for browsers and performance monitoring tools that don't know the content in the page. How can browsers and tools be expected to know which parts of the page are most important? The people who are best equipped to know this are website owners, which is why we encourage adding&nbsp;<a href="/blog/user-timing-and-custom-metrics/">custom metrics using User Timing</a>&nbsp;and <a href="http://support.speedcurve.com/understanding-metrics/hero-rendering-times">Element Timing.</a></p> <p>There are two drawbacks to custom metrics and element timing: every website has to do work to implement them and you can't compare your metrics to your competitors. To solve these problems, we came up with <a href="/blog/web-performance-monitoring-hero-times/">Hero Rendering Times</a>, which use heuristics to determine the critical parts of the page. After analyzing thousands of websites we settled on three hero elements that are critical across almost all websites:</p> <ul> <li><strong>largest image</strong>&nbsp;&ndash; Many websites have a "hero image" - an eye-catching image that dominates the viewport.&nbsp;</li> <li><strong>largest background image</strong>&nbsp;&ndash; Instead of using an IMG image, sites like <a href="https://www.airbnb.com/">Airbnb</a> and <a href="https://www.apple.com/">Apple</a> use a background image. (In fact, Apple's background image has <a href="https://www.apple.com/v/home/do/images/heroes/iphone-x/iphone_x_large.jpg">"heroes" in the URL</a>.)</li> <li><strong>largest text</strong>&nbsp;&ndash; Often the critical part of the page is text, especially on media sites that contain headlines for each story. Since these pages often use custom fonts, measuring largest text (within the first h1 tag on the page) is a good way to track how fonts affect rendering.</li> </ul> <p>We launched Hero Rendering Times last year as part of SpeedCurve synthetic testing. Below is an <a href="https://speedcurve.com/speedcurve-enterprise/top-sites/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=38668&amp;u=73840&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3">example from The New York Times</a>. With Hero Rendering Times, site owners can track when critical parts of the page actually render and get a much better idea of what the user experiences.</p> <p><a href="/speedcurve-enterprise/top-sites/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=38668&amp;u=73840&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3" target="_blank" rel="noopener"><img style="width: 100%; max-width: 1200px;" src="https://img.speedcurve.com/blog/hero-image.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/hero-image.png?w=250&amp;auto=format,compress 200w, https://img.speedcurve.com/blog/hero-image.png?w=533&amp;auto=format,compress 533w, https://img.speedcurve.com/blog/hero-image.png?w=772&amp;auto=format,compress 772w, https://img.speedcurve.com/blog/hero-image.png?w=959&amp;auto=format,compress 959w, https://img.speedcurve.com/blog/hero-image.png?w=1169&amp;auto=format,compress 1169w, https://img.speedcurve.com/blog/hero-image.png?w=1328&amp;auto=format,compress 1328w, https://img.speedcurve.com/blog/hero-image.png?w=1464&amp;auto=format,compress 1464w, https://img.speedcurve.com/blog/hero-image.png?w=1639&amp;auto=format,compress 1639w, https://img.speedcurve.com/blog/hero-image.png?w=1788&amp;auto=format,compress 1788w, https://img.speedcurve.com/blog/hero-image.png?w=1926&amp;auto=format,compress 1926w, https://img.speedcurve.com/blog/hero-image.png?w=2069&amp;auto=format,compress 2069w, https://img.speedcurve.com/blog/hero-image.png?w=2199&amp;auto=format,compress 2199w, https://img.speedcurve.com/blog/hero-image.png?w=2400&amp;auto=format,compress 2400w" alt="Largest Image Rendering Time" /></a></p> <p>Other rendering metrics have come along recently, including First Contentful Paint and First Meaningful Paint. These metrics use different heuristics to identify when critical content has been rendered, but the results vary. In my <a href="/blog/rendering-metrics/">Rendering Metrics</a> blog post &ndash; which compares how these metrics work and how well they approximate user-perceived performance &ndash; I shared a <a href="http://lab.speedcurve.com/rendering/picker.php">picker</a> where you can test your own perception of critical content rendering and see how your perceptions align with a variety of popular metrics. For the purposes of that blog post, I had to come up with a composite metric for the Hero Rendering Times:</p> <p><code>max(h1, (biggest_img || bg_img))</code></p> <p>The composite metric is computed by taking the maximum of the largest text time ("h1") and the biggest IMG time (or biggest background image if biggest IMG doesn't exist).</p> <h2>Introducing Last Painted Hero</h2> <p>While at <a href="https://perfmattersconf.com/">#PerfMatters Conference</a> last week I bumped into&nbsp;<a href="https://twitter.com/digitarald">Harald Kirschner</a> (Mozilla) and <a href="https://twitter.com/paul_irish">Paul Irish</a> (Chrome) who were talking about Hero Rendering Times as a standard metric. Paul asked if the composite metric had a name. I said it didn't &ndash; and in fact we hadn't yet rolled out the composite metric at SpeedCurve. Paul got on stage the next day and <a href="https://twitter.com/Zizzamia/status/979145127632388096">proposed the name Last Painted Hero</a>. I like it!</p> <p>After a busy few days, today we formally launched Last Painted Hero. If you're already a SpeedCurve user, Last Painted Hero is available in your Favorites dashboards, where you can chart it alongside your other metrics &ndash; or alongside your competitors. (If you're not a SpeedCurve user yet, <a href="/plan/trial/">try us for free</a>!)</p> <p><a href="/speedcurve-enterprise/top-sites/favorite/?d=21&amp;db=3735&amp;de=1&amp;ds=1&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3"><img class="blog-img" src="https://img.speedcurve.com/blog/last-painted-hero.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <p>We also provide First Painted Hero, so you can track your best case and your worst case for hero elements in your pages.</p> <p><a href="/speedcurve-enterprise/top-sites/favorite/?d=21&amp;db=3735&amp;de=1&amp;ds=1&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3"><img class="blog-img" src="https://img.speedcurve.com/blog/first-painted-hero.png?auto=format,compress&amp;fit=clamp&amp;max-w=1000" alt="" /></a></p> <h2>This is just the beginning for First and Last Painted Hero</h2> <p>We're excited to get your input and make improvements. To that end, we're working on a pull request to add these metrics to <a href="https://www.webpagetest.org/">public WebPageTest</a>. Regardless of whether you use SpeedCurve or WebPageTest, we hope you'll take a look at First and Last Painted Hero and give us your feedback.</p> Wed, 04 Apr 2018 00:00:00 +1200 SpeedCurve Consulting Services with Tim Kadlec https://speedcurve.com/blog/speedcurve-consulting-services-with-tim-kadlec <div style="float: right;"><img src="https://d33wubrfki0l68.cloudfront.net/a17b198e3c707a2e2e0fc4af45090effcc547955/2d42c/images/me-2.jpg" /></div> <p>We're excited to announce that SpeedCurve is partnering with <a href="https://timkadlec.com/">Tim Kadlec</a> to provide consulting services to our customers!</p> <p>Tim is a recognized expert when it comes to web performance. He has spoken at numerous conferences including Velocity, Fluent, QCon, SmashingConf, Beyond Tellerand, and WebStock. He wrote <a href="http://shop.oreilly.com/product/0636920039730.do">High Performance Images</a> and <a href="http://implementingresponsivedesign.com/">Implementing Responsive Design</a>, as well as contributing to other books. Mark, Tammy and I have each collaborated with Tim on side projects. We're full of gleeful anticipation as we look forward to this opportunity to work together again.</p> <p>In the first sentence I mentioned that this is a partnership. Here's what that means: Tim will continue to do consulting outside of SpeedCurve, and if you're not a SpeedCurve customer we encourage you to&nbsp;<a href="https://timkadlec.com/me/">contact him directly</a>. Tim will also be running SpeedCurve's consulting services. This partnership brings special advantages to SpeedCurve customers:</p><ul> <li>This partnership lets Tim get intimately familiar with SpeedCurve. This allows him to help our clients set up and focus their SpeedCurve testing, and get the most out of the results.</li> <li>As Tim works with SpeedCurve clients, he will learn more about what they need from SpeedCurve. He'll feed that back into our product development, resulting in an even better product and more successful customers.</li> <li>This partnership provides a single billing entity for both performance monitoring and consulting.</li> <li>A big area of focus for SpeedCurve going forward is our Improve section, where we provide specific recommendations on how to make your website faster. This is a fun challenge where we codify the knowledge inside the heads of performance experts. Since Tim will be identifying these key performance recommendations as part of his consulting engagements, he'll be well positioned to help make the Improve offering better by translating those suggestions into code so that all SpeedCurve customers can benefit.</li> </ul> <p>Take a look at our <a href="/pricing/">Pricing page</a> to read more about SpeedCurve's consulting services.&nbsp;<a href="mailto:support@speedcurve.com">Send us an email</a> if you'd like more information or want to enquire about engaging Tim. And watch the Improve content as we try to convert everything that's in Tim's head to code (just the performance stuff).</p> Mon, 26 Mar 2018 00:00:00 +1300 More RUM metrics in your Favorites dashboards https://speedcurve.com/blog/new-real-user-monitoring-metrics <p>SpeedCurve comes with a great set of dashboards for <a href="/features/synthetic/">synthetic</a> and <a href="/features/lux/">RUM</a>. But we know that one size does <em>not</em> fit all when it comes to data charts, which is why we've invested so much work into the <a href="/blog/multiple-favorites-dashboards/">Favorites dashboards</a>. For customers who use LUX, it provides a place to create custom charts that combine metrics from synthetic and RUM.</p> <p>We just added some new RUM metrics from LUX in Favorites to allow for even more customized monitoring:</p> <ul> <li><strong>Page Views</strong>&nbsp;&ndash; The number of page views, including Single-Page-App page transitions</li> <li><strong>Sessions</strong>&nbsp;&ndash; The number of unique sessions</li> <li><strong>Session Length</strong>&nbsp;&ndash; The number of page views per session</li> <li><strong>Bounced Sessions</strong>&nbsp;&ndash; The number of sessions that only have one page view</li> <li><strong>Bounce Rate</strong>&nbsp;&ndash; The percentage of bounced sessions out of the total number of sessions</li> </ul><p>Bounce rate is a powerful metric for correlating performance&nbsp;metrics with&nbsp;business metrics. In the chart below, we see that as frontend time gets faster, bounce rate drops from 49% to 42%, and then rises again as frontend time regresses. This is a great way of showing why staying vigilant about the speed of your site is important for keeping your users happy.</p> <p style="text-align: center;"><img src="https://img.speedcurve.com/blog/bouncerate-frontend.png?auto=format,compress&amp;fit=crop&amp;max-w=1000" alt="Bounce rate vs Frontend" width="670" height="360" /></p> <h2>How to get started with these new metrics</h2> <p><strong>If you're already a LUX user:</strong> These metrics are waiting in your Favorites dashboard. Give them a try and send us your feedback at support@speedcurve.com.</p> <p><strong>If you're not a LUX user yet:</strong> We'd love to have you try us out for free.&nbsp;<a href="/plan/trial/">Sign up for your 30-day trial.</a></p> Wed, 14 Mar 2018 00:00:00 +1300 Faster test agents and more regions https://speedcurve.com/blog/faster-agents-more-regions <p>We&rsquo;re kicking off 2018 with a bang and a <a href="http://larahogan.me/donuts/">donut.</a> We&rsquo;ve been busy preparing all-new faster test agents and they&rsquo;re now available for you&nbsp;to switch to &ndash; at no extra cost!&nbsp;</p> <p style="text-align: center;"><strong>Go to your Settings to switch to faster test agents.</strong></p> <h2>Faster agents</h2> <p>All our agents now run on much faster AWS <a href="http://support.speedcurve.com/synthetic-settings/test-agent-locationsregions">C4.Large</a> instances, which better approximate current desktop browsers. We&rsquo;ve also switched to the latest WebPageTest agent running on Linux.</p> <p><strong>How much faster? 20-30%</strong></p> <p>When you switch to the new agents, some of your metrics will get <strong>20-30%</strong> faster, so pick a time to switch that suits your team. In between projects or the start of the month are good times to set a new baseline.</p> <p style="text-align: center;"><img style="max-width: 1000px; width: 100%;" src="https://img.speedcurve.com/blog/faster-agents.png?w=1689&amp;auto=format,compress" sizes="(max-width: 1000px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/faster-agents.png?w=300&amp;auto=format,compress 300w, https://img.speedcurve.com/blog/faster-agents.png?w=400&amp;auto=format,compress 400w, https://img.speedcurve.com/blog/faster-agents.png?w=600&amp;auto=format,compress 600w, https://img.speedcurve.com/blog/faster-agents.png?w=1000&amp;auto=format,compress 1000w, https://img.speedcurve.com/blog/faster-agents.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/faster-agents.png?w=2000&amp;auto=format,compress 2000w" alt="Performance Budgets" /></p><h2>More regions</h2> <p>We&rsquo;ve added four&nbsp;new regions you can run your tests from. Hello&hellip; India, Canada, England, and Korea!</p> <h2>CPU throttling</h2> <p>SpeedCurve now supports <a href="http://support.speedcurve.com/synthetic-settings/cpu-throttle">CPU throttling</a>, so you can be faster and slower at the same time! Prepare for <a href="https://www.youtube.com/watch?v=BHO70H9tvqo">the next billion people</a> coming online with sloooow emulated mobile devices.</p> <h2>See ya Safari!</h2> <p>Safari is awesome &ndash; but not the version on Windows that's been dead in the water for a few years now. We&rsquo;re dropping support for Safari on Windows. When you switch to the new agents, it will go <em>poof</em> and disappear from your settings.</p> <h2>Tweak your perf budgets</h2> <p>With your metrics changing 20-30% now&rsquo;s the perfect time to <a href="http://support.speedcurve.com/synthetic-settings/performance-budgets">review your performance budgets and alerts.</a> To help, we&rsquo;ve added performance budgets to all Favorites charts. This means you can see the data you&rsquo;re setting a budget for as you create the budget!</p> <h2>Celebrate your perf culture&nbsp;</h2> <p>Time to gather the team and share what&rsquo;s new in SpeedCurve. While you&rsquo;re together, Tammy has some awesome tips on <a href="https://speedcurve.com/blog/web-performance-culture/">strengthening your performance culture.</a></p> Tue, 06 Feb 2018 00:00:00 +1300 How to create a healthy, happy performance culture https://speedcurve.com/blog/web-performance-culture <p>One of the best parts of my job is getting to talk to so many people from so many different companies about web performance. Every company is different, and I learn a ton from talking to each one.&nbsp;But one question that almost every person asks me &ndash; regardless of what industry they're in&nbsp;or the size of&nbsp;their&nbsp;organization &ndash; is this:</p> <p><strong>How can I create a stronger culture of web performance at my company?</strong></p> <p>Creating a performance culture means creating a feedback loop in your company or team that looks like this:</p> <p style="text-align: center;"><img style="max-width: 600px; width: 100%;" src="https://img.speedcurve.com/blog/perf-culture-feedback-loop.png?w=1417&amp;auto=format,compress" sizes="(max-width: 1417px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/perf-culture-feedback-loop.png?w=300&amp;auto=format,compress 300w, https://img.speedcurve.com/blog/perf-culture-feedback-loop.png?w=400&amp;auto=format,compress 400w, https://img.speedcurve.com/blog/perf-culture-feedback-loop.png?w=600&amp;auto=format,compress 600w, https://img.speedcurve.com/blog/perf-culture-feedback-loop.png?w=1000&amp;auto=format,compress 1000w, https://img.speedcurve.com/blog/perf-culture-feedback-loop.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/perf-culture-feedback-loop.png?w=1417&amp;auto=format,compress 1417w" alt="Culture Feedback Loop" /></p> <p>In other words: <strong>Get people to care, show them what they can do to help, and then give them positive reinforcement when you get results.</strong> It's basic human psychology, and it might&nbsp;seem obvious when you see it in a super-simple graphic. But it's surprisingly easy to&nbsp;miss&nbsp;these steps and instead skip ahead to the part where you invest in awesome performance tools, and then wonder why all your performance efforts feel like such a painful uphill slog.</p> <p>In this post, I'm going to share some proven tips and best practices to help you create a healthy, happy, celebratory performance culture.&nbsp;</p><p>Side&nbsp;note: You'll notice that nowhere&nbsp;in that feedback loop&nbsp;does it say "Invest in whizbang performance tool [INSERT PRODUCT NAME HERE]." That's because these tips are about people, not tools. It goes without saying that you'll want to make sure you're using the right tools to monitor, measure, and optimize your site. But all the tools in the world won't make a difference if your people aren't invested in making a difference.</p> <h2>Identify&nbsp;what people care about</h2> <p>If you ask different people in your organization how much they care about performance today, you might just get a bunch of blank stares. But if you gave them a checklist and asked them to tick off any of the following boxes of things they care about, you'd probably get a more enthusiastic response:</p> <ul> <li>bounce rate</li> <li>cart size</li> <li>conversions</li> <li>revenue</li> <li>time on site</li> <li>page views</li> <li>search traffic</li> <li>user satisfaction</li> <li>user retention</li> </ul> <p>Over the years, I've learned that performance can be mapped to all of these metrics &ndash; and almost any other business metric you can think of. <strong>To hook different people&nbsp;on performance, you need to understand&nbsp;which metric&nbsp;motivates them.</strong>&nbsp;</p> <p>For example, an&nbsp;executive might want to know the impact of performance improvements and slowdowns on conversions and overall revenue, while folks&nbsp;in your marketing team might focus on the impact of performance on everything from SEO to user engagement.&nbsp;</p> <p><strong>Once you know what people care about,&nbsp;connect the dots for them.</strong> Case studies are an&nbsp;awesome way to do this, which is why I've been helping curate <a href="https://wpostats.com/" target="_blank" rel="noopener">WPOstats</a>, a vendor-neutral&nbsp;directory of performance case studies. For example,&nbsp;if someone on your&nbsp;executive&nbsp;team cares about&nbsp;conversions and revenue, you can direct them to a set of studies that focus on the impact of performance on <a href="https://wpostats.com/tags/revenue/" target="_blank" rel="noopener">revenue</a> and <a href="https://wpostats.com/tags/conversion/" target="_blank" rel="noopener">conversion rate</a>. People on your marketing team probably care about <a href="https://wpostats.com/tags/traffic/" target="_blank" rel="noopener">traffic</a> and <a href="https://wpostats.com/tags/engagement/" target="_blank" rel="noopener">engagement</a>. And so on.</p> <p>Case studies are a great way to convert performance skeptics. They're also a great way to get people fired up about making your site faster.&nbsp;When you learn, say, that Staples reduced its median load time by 1 second and saw a 10% increase in conversion rate, that's pretty compelling.&nbsp;</p> <p>Case studies from other companies are compelling, but using your own data is even more compelling. If you're a SpeedCurve <a href="/features/lux/">LUX</a> user, the <a href="/blog/web-performance-monitoring-user-engagement/">user engagement charts</a> that are at the top of your Performance dashboard are an&nbsp;easy way to illustrate the correlation between&nbsp;performance and bounce rate using your own data.&nbsp;(One thing we've found is that almost everyone can relate to bounce rate as a meaningful metric.)</p> <p style="text-align: center;"><img style="max-width: 1000px; width: 100%;" src="https://img.speedcurve.com/blog/perf-culture-lux-load-time-vs-bounce-rate-02.png?w=1689&amp;auto=format,compress" sizes="(max-width: 1000px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/perf-culture-lux-load-time-vs-bounce-rate-02.png?w=300&amp;auto=format,compress 300w, https://img.speedcurve.com/blog/perf-culture-lux-load-time-vs-bounce-rate-02.png?w=400&amp;auto=format,compress 400w, https://img.speedcurve.com/blog/perf-culture-lux-load-time-vs-bounce-rate-02.png?w=600&amp;auto=format,compress 600w, https://img.speedcurve.com/blog/perf-culture-lux-load-time-vs-bounce-rate-02.png?w=1000&amp;auto=format,compress 1000w, https://img.speedcurve.com/blog/perf-culture-lux-load-time-vs-bounce-rate-02.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/perf-culture-lux-load-time-vs-bounce-rate-02.png?w=1689&amp;auto=format,compress 1689w" alt="LUX load time vs bounce rate" /></p> <h2>Fire up people's competitive spirit</h2> <p>One of the&nbsp;fastest routes to getting people to care about performance is to <strong>show them how slow their site is compared to their competitors</strong>. One of the great things about synthetic monitoring&nbsp;via tools like <a href="https://www.webpagetest.org/" target="_blank" rel="noopener">WebPageTest</a> (which <a href="/features/synthetic/">SpeedCurve synthetic</a> is built on top of) is that you can test any page on the web, not just your own. This lets you do great things like generate side-by-side&nbsp;filmstrips &ndash; and even better: videos &ndash; of your site alongside your competitors' sites (or any other aspirational sites).</p> <p style="text-align: center;"><video style="max-width: 904px; border: 10px solid #282828;" autoplay="autoplay" loop="loop" controls="controls" width="100%"><source src="https://assets.speedcurve.com/img/blog/perf-culture-video.mp4" type="video/mp4" /></video></p> <p>Because SpeedCurve synthetic monitoring is built on top of WebPageTest, you can take advantage of&nbsp;WPT's filmstrip and video capabilities. Here's how to <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/benchmark-yourself-against-your-competitors">set up ongoing competitive benchmarking</a>&nbsp;and <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/how-to-get-comparison-videos">generate comparison videos</a>&nbsp;.</p> <h2>Make things visible (but not overwhelming)</h2> <p>If you want to see&nbsp;non-technical stakeholders' eyes glaze over, show them an endless series of dashboards and charts. <em>Less is more</em>&nbsp;should be your mantra. <strong>In the same way that you need to understand what motivates different people in your organization, you also need to tailor your reporting.</strong>&nbsp;You can start by <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts">creating separate dashboards for different stakeholders</a>. Each dashboard should contain only the graphs that are relevant to that stakeholder group. For some people, your performance report might be just a single graph or a very simple dashboard that shows them the data points they care about. (It stands to reason that you should always be ready to go deeper upon request.)</p> <p>One excellent practice that's used effectively by&nbsp;companies like&nbsp;Lonely Planet and Ticketmaster is to have monitors&nbsp;mounted in&nbsp;open areas of their offices, displaying key performance stats and comparison videos. Lara Hogan (previously director of engineering at Etsy) wrote <a href="http://alistapart.com/article/performance-showing-versus-telling" target="_blank" rel="noopener">a great blog post</a>&nbsp;demonstrating&nbsp;how Etsy took advantage of the power of showing versus telling.</p> <h2>Collaborate on performance budgets</h2> <p>Performance budgets are an important tool for ensuring your site is delivering a great user experience. The practice of using budgets to track performance took off with <a href="https://timkadlec.com/2013/01/setting-a-performance-budget/" target="_blank" rel="noopener">this post</a> by Tim Kadlec. <strong>The idea is to identify your performance goals, then track the metrics that help you achieve your goals.</strong>&nbsp;<a href="/blog/performance-budgets-in-action/">Setting performance budgets</a>&nbsp;lets you focus on the metrics you care about most, create goals, set budgets based on those goals, and&nbsp;<a href="http://support.speedcurve.com/synthetic-settings/when-do-performance-budget-notifications-get-sent">get alerts</a>&nbsp;when your&nbsp;numbers go out of bounds.&nbsp;</p> <p>As mentioned near the top of this post, <a href="/blog/rendering-metrics/">there's no one-size-fits-all unicorn metric</a> that will get everyone in your company excited about performance. This means there's no one-size-fits-all metric you should focus on for your performance budgets. Instead, your performance budgets can run a gamut that includes:</p> <ul> <li>Someone in ops needs to know&nbsp;Time to First Byte&nbsp;so that they can investigate back-end issues.</li> <li>One of your developers might care about start render or Speed Index, because they want to get a sense of how&nbsp;well the page is built &ndash; for instance, are there any blocking scripts or stylesheets.&nbsp;</li> <li>Someone in your marketing team wants to know how&nbsp;quickly the page&nbsp;delivers the most important content from a user's perspective, so&nbsp;they might want to <a href="/blog/web-performance-monitoring-hero-times/">track the rendering of hero images</a>.&nbsp;&nbsp;</li> </ul> <p><strong>To make people accountable, give&nbsp;them ownership over their own performance budgets</strong> and make sure they receive alerts when their budgets are exceeded.</p> <p>Super important: No sandbagging allowed. You wouldn't say you're going on a diet, then give yourself a limit of 3000 calories a day. In the same way, you want to keep your budgets realistic without making them overly forgiving. The point of a performance budget is to blend the aspirational with the achievable.</p> <p style="text-align: center;"><img style="max-width: 1000px;" src="https://assets.speedcurve.com/img/blog/budget.png" alt="Image performance budgets" width="100%" /></p> <p><strong>Case study:</strong>&nbsp;<a href="https://www.zillow.com/engineering/bigger-faster-more-engaging-budget/" target="_blank" rel="noopener">Here's how Zillow creates and enforces performance budgets</a></p> <h2>Score some easy wins&nbsp;</h2> <p>If you're new to performance &ndash; or if you're tackling a site that's new to you &ndash; there's a good chance there's some low-hanging fruit you can optimize. The first places to look are <a href="/blog/web-performance-monitoring-hero-times/">images</a> and <a href="/blog/measuring-blocking-resources/">blocking stylesheets and scripts</a> (especially <a href="/blog/ux-focus-for-waterfalls-and-third-parties/">third parties</a>).</p> <p>For example, the team at Fanatics.com did a one-month performance sprint where the most impactful changes they made were simple image optimizations: they improved image quality and compression, and they fixed an image sprite that was blocking pages from rendering. <strong>As a result, they saw a 2-second improvement in median load times and almost doubled their mobile conversions</strong> &ndash; a really big deal, since more than half their revenue comes from mobile. This relatively easy win&nbsp;was a fantastic way to get performance buy-in throughout their company.</p> <p>With <a href="/features/synthetic/">synthetic monitoring</a>, you can <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/how-to-find-and-fix-performance-issues-on-your-pages">drill down to find the most critical defects</a> that are hurting specific pages. Pair that with <a href="/features/lux/">real user monitoring</a>, which lets you <a href="http://support.speedcurve.com/lux-settings/lux-customer-data">map performance to biz metrics like conversions</a>.</p> <p style="text-align: center;"><img style="max-width: 768px;" src="https://img.speedcurve.com/blog/perf-recommendations.png?w=919&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/perf-recommendations.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/perf-recommendations.png?w=526&amp;auto=format,compress 526w, https://img.speedcurve.com/blog/perf-recommendations.png?w=742&amp;auto=format,compress 742w, https://img.speedcurve.com/blog/perf-recommendations.png?w=919&amp;auto=format,compress 919w, https://img.speedcurve.com/blog/perf-recommendations.png?w=1854&amp;auto=format,compress 1854w" alt="Performance Recommendations" width="100%" /></p> <h2>Celebrate!</h2> <p>We live in a culture that doesn't celebrate success as much as it should. (Disclosure: I'm totally guilty of this.)&nbsp;So consider this a reminder: <strong>Every time you move the needle on performance &ndash; and that moves the needle on user engagement or revenue or whatever your company cares about &ndash; shout it from the rooftop.</strong> Or if that's not allowed at your office, email is fine, too.</p> <p>Here at SpeedCurve, we have a #ring_the_bell Slack channel where we share&nbsp;wins and milestones, both big and small. And in the spirit of&nbsp;<a href="http://larahogan.me/donuts/" target="_blank" rel="noopener">Lara Hogan's donut manifesto</a>, we send each other fun gift baskets to celebrate victories.&nbsp;</p> <h2>Share what you've learned</h2> <p>Shouting from the rooftops (and eating donuts) is a great start. Next, share what you did and what you learned from it. This can be in the form of&nbsp;company- or department-wide emails, posts on your in-house dev blog, and internal meetups.&nbsp;I know some&nbsp;performance teams that do regular monthly technical meetups, and once or twice a year they do a company-wide event where they share all their greatest webperf stats and victories.&nbsp;</p> <p><strong>Cultivating a healthy in-house performance culture also means embracing the fact that you're&nbsp;a member of a culture that's much bigger than your company.</strong> There are so many ways to get involved and to learn from other webperf enthusiasts:</p> <ul> <li>Share your case studies and successes (if your company allows it) on a public-facing tech blog. Good examples: Etsy's <a href="https://codeascraft.com/" target="_blank" rel="noopener">Code as Craft</a>, Cars.com's <a href="https://tech.cars.com/" target="_blank" rel="noopener">Tech Blog</a>, and the Financial Times' <a href="http://engineroom.ft.com/" target="_blank" rel="noopener">Engine Room</a>.</li> <li>Follow the <a href="https://twitter.com/search?vertical=default&amp;q=%23webperf&amp;src=typd" target="_blank" rel="noopener">#webperf hashtag on Twitter</a>.</li> <li>Participate in one of the many <a href="https://www.meetup.com/topics/web-performance/" target="_blank" rel="noopener">Web Performance Meetups</a> around the world.&nbsp;</li> <li>Attend&nbsp;performance-oriented conferences like <a href="https://perfmattersconf.com/" target="_blank" rel="noopener">#PerfMatters</a>, <a href="https://2018.deltavconf.com/" target="_blank" rel="noopener">DeltaV</a>, and <a href="https://conferences.oreilly.com/fluent/fl-ca" target="_blank" rel="noopener">O'Reilly Fluent</a>.&nbsp;</li> </ul> <h2>Additional&nbsp;resources</h2> <ul> <li>Cars.com explains <a href="https://tech.cars.com/building-a-web-performance-culture-902f34394b50" target="_blank" rel="noopener">how they use SpeedCurve to create a performance culture</a>.</li> <li><a href="https://responsivewebdesign.com/podcast/vox-media-performance/" target="_blank" rel="noopener">This RWD podcast episode</a> is with a couple of members of Vox Media's performance team. Among other things, they do a great job of talking about perf culture.</li> <li>Lara Hogan&nbsp;has written an excellent book called <a href="http://designingforperformance.com/" target="_blank" rel="noopener">Designing for Performance</a>,&nbsp;and&nbsp;she's kindly made&nbsp;the text available&nbsp;online. The entire book is great, and <a href="http://designingforperformance.com/changing-culture/" target="_blank" rel="noopener">chapter 8 is dedicated to performance culture</a>.&nbsp;</li> </ul> Thu, 01 Feb 2018 00:00:00 +1300 Evaluating rendering metrics https://speedcurve.com/blog/rendering-metrics <p>At SpeedCurve, we're fond of the phrase "a joyous user experience". Creating this joy requires delivering what users want as quickly as possible. It's important that the critical content is downloaded&nbsp;and rendered before users get frustrated.</p> <p>Network metrics have been around for decades, but rendering metrics are newer. Speed Index. Start Render. Time to First Interactive. First Meaningful Paint. These are a few of the rendering metrics that currently exist. What do they mean? How do they compare? Which are best for you? Let's take a look.</p><h3 style="text-align: left;">A brief history of performance metrics</h3> <p>Metrics quantify behavior. In the case of performance metrics, we're trying to capture the behavior of a website in terms of speed and construction. By "construction"&nbsp;I mean statistics about how the site is built such as number of HTTP requests, size of stylesheets, and DOM depth. Speed is tracked by time-based metrics that capture when things happen during the user's experience with the website: start render, DOM interactive, page load, etc. Often, construction metrics are useful for diagnosing the cause of changes in&nbsp;speed metrics.&nbsp;</p> <div style="padding-left: 30px;"><em>Why did start render get slower?</em></div> <p style="padding-left: 30px;"><em>Ah-ha, the number of blocking scripts increased!</em></p> <p>While construction metrics&nbsp;are fairly well established, time-based performance metrics are newer and still evolving. In the old days, the main time-based performance metric was <code>window.onload</code>. (Actually, before <code>window.onload</code> the main performance metric was the response time of the HTTP request for the HTML document!)&nbsp;</p> <p>The <a href="https://www.w3.org/webperf/">W3C Web Performance Working Group</a> changed everything with the <a href="https://www.w3.org/TR/navigation-timing-2/">Navigation Timing</a>, <a href="https://cdn.rawgit.com/w3c/resource-timing/V2/index.html">Resource Timing</a>, and <a href="https://w3c.github.io/user-timing/">User Timing</a> specifications. Navigation Timing and Resource Timing let us measure things like DNS lookups, TCP connections, and SSL negotiations for the main page as well as all the resources in the page. Most importantly, Navigation Timing gives us a spec'ed milestone for when the page begins to load (<code>performance.timing.navigationStart</code>), as well as other milestones like DOM Interactive and DOM Complete. User Timing doesn't come with any predefined metrics, but instead provides an API for capturing website-specific milestones by simply calling <code>performance.mark</code> and <code>performance.measure</code>.&nbsp;</p> <h3>Gaps in today's performance metrics</h3> <p>While the specifications mentioned previously have greatly improved our ability to measure performance, they actually don't help us capture the most important aspects of web performance. There are two big gaps:&nbsp;</p> <h4>Gap 1: Browser Main Thread</h4> <p>The gating factor in web performance ten years ago was network. Today, the main bottleneck is CPU. The cause of this shift is the increase in CSS and JavaScript, as well as more mobile users. Over the last seven years, the number of scripts jumped from 12 to 36 and the compressed size increased from 110K to 617K for the world's top 1000 websites according to the <a href="http://httparchive.org/trends.php?s=Top1000&amp;minlabel=Jan+20+2011&amp;maxlabel=Nov+15+2017#bytesJS&amp;reqJS">HTTP Archive</a>.</p> <p style="text-align: center;"><a href="http://httparchive.org/trends.php?s=Top1000&amp;minlabel=Jan+20+2011&amp;maxlabel=Nov+15+2017#bytesJS&amp;reqJS"><img style="max-width: 600px;" src="/img/blog/uxmetrics-ha-js.png" alt="JS Growth" width="100%" /></a></p> <p>Construction metrics provide information about the number and size of scripts and stylesheets. But this isn't a direct measure of how JavaScript is impacting the page. Suppose a website has just one script, but that script takes 3 seconds to execute. Another website might have four scripts, but each of them takes less than 100 milliseconds to execute. The number of scripts is a good estimate for whether JavaScript is the bottleneck, but it's based on assumptions about typical execution times.</p> <p>It would be better if there was a way to measure the time each script, especially the blocking scripts, consume on the browser's main thread. Chrome Dev Tools has this information, and a year or so ago Pat Meenan added this to <a title="JS Pink Bars" href="https://wpt1.speedcurve.com/video/compare.php?tests=171130_1J_740afc574b8073ba95af1e00cc1f3817-r:2-c:0">WebPageTest's waterfall charts</a> using pink bars:&nbsp;</p> <p style="text-align: center;"><a href="https://wpt1.speedcurve.com/video/compare.php?tests=171130_1J_740afc574b8073ba95af1e00cc1f3817-r:2-c:0"><img style="max-width: 679px;" src="/img/blog/uxmetrics-pinkbars.png" alt="JS Pink Bars" width="100%" /></a></p> <p>This example illustrates how construction metrics can be misleading. The first script in the waterfall above is the smallest so many people might assume it would execute the fastest, but it actually takes the longest to execute. This insight into browser main thread activity isn't limited to JavaScript execution; WebPageTest also provides information about layout, paint, and loading. In order to help teams focus on CPU, SpeedCurve extracts this information from WebPageTest and shows it in our default <a title="CPU Charts" href="/speedcurve-enterprise/top-100/test/171130_1J_740afc574b8073ba95af1e00cc1f3817/?share=qb3kun47d1buotfo4994o9a4kifbbi#cpu">dashboards</a>.</p> <p style="text-align: center;"><a href="/speedcurve-enterprise/top-100/test/171130_1J_740afc574b8073ba95af1e00cc1f3817/?share=qb3kun47d1buotfo4994o9a4kifbbi"><img style="max-width: 582px;" src="/img/blog/uxmetrics-cpu.png" alt="CPU Charts" width="100%" /></a></p> <p>However, this insight into browser main thread bottlenecks is limited to synthetic testing. It would be great if there was a CPU Timing specification so these metrics were also available in Real User Monitoring (<a title="RUM" href="http://support.speedcurve.com/testing-process/synthetic-vs-real-user-monitoring-rum">RUM</a>). The <a title="Long Tasks API" href="https://w3c.github.io/longtasks/">Long Tasks API</a>&nbsp;is new and could help address this gap.</p> <h4>Gap 2: Rendering</h4> <p>There are a number of rendering metrics available today, but there's a "gap" because of the lack of standardization and accuracy. Let's take a quick survey.</p> <p>WebPageTest is the pioneer in rendering metrics (and many many other parts of performance monitoring). Here's what it offers when it comes to rendering:</p> <ul> <li><strong><a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index">Speed Index</a></strong> is "the average time at which visible parts of the page are displayed. It is expressed in milliseconds". Speed Index is not a specific point-in-time but instead is an aggregate stat so is a bit apples-to-oranges when compared to these other time-based metrics.</li> <li><strong><a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics">Start Render</a></strong> is "the time from the start of the initial navigation until the first non-white content is painted".</li> <li><strong><a href="https://github.com/WPO-Foundation/webpagetest/blob/master/docs/Metrics/TimeToInteractive.md">Time to First Interactive</a></strong>&nbsp;(aka, Time to CPU Idle) is "when the page is first expected to be usable and will respond to input quickly." Specifically, it is the first span of 5 seconds where the browser main thread is never blocked for more than 50ms after First Contentful Paint. Note that this is more than just a rendering metric as it also captures interactivity.</li> <li><strong><a href="https://github.com/WPO-Foundation/webpagetest/blob/master/docs/Metrics/TimeToInteractive.md">Time to Consistently Interactive</a></strong>&nbsp;(aka, Time to Interactive) is "when the page is first expected to be usable and will respond to input quickly." Specifically, it is the first span of 5 seconds where the browser main thread is never blocked for more than 50ms after First Contentful Paint with no more than 2 in-flight requests. Note that this is more than just a rendering metric as it also captures interactivity.</li> <li><strong><a href="https://sites.google.com/a/webpagetest.org/docs/advanced-features/raw-test-results">Visually Complete</a></strong> is the "first time when the visual progress reaches 100%".</li> </ul> <p>The new <a href="https://www.w3.org/TR/paint-timing/">Paint Timing</a> specification defines two new metrics. You can extract these values using <code>performance.getEntriesByType("paint")</code>:</p> <ul> <li><a href="https://www.w3.org/TR/paint-timing/#sec-terminology"><strong>First Paint</strong></a> is "the time when the browser first rendered after navigation. This excludes the default background paint, but includes non-default background paint."</li> <li><a href="https://www.w3.org/TR/paint-timing/#sec-terminology"><strong>First Contentful Paint</strong></a> is "when the browser first rendered any text, image (including background images), non-white canvas or SVG."</li> </ul> <p>To compensate for shortcomings in First Contentful Paint, Chrome's <a href="https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint">Lighthouse</a> project attempts to capture when primary content is rendered to the user. This metric can be <a href="https://docs.google.com/document/d/1BR94tJdZLsin5poeet0XoTW60M0SjvOJQttKT-JK8HI/view">found in Chrome traces</a>.&nbsp;</p> <ul> <li><a href="https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint"><strong>First Meaningful Paint</strong></a> is "the paint after which the biggest above-the-fold layout change has happened, and web fonts have loaded." (More detail is available <a href="https://docs.google.com/document/d/1BR94tJdZLsin5poeet0XoTW60M0SjvOJQttKT-JK8HI/view">here</a>.)</li> </ul> <p>SpeedCurve also created a new metric that tries to capture when critical content is rendered to the page:</p> <ul> <li><a href="/blog/web-performance-monitoring-hero-times/"><strong>Hero Rendering Times</strong></a> is a combination of when the largest IMG, H1, and background image in the viewport are rendered. The composite metric is computed by taking the maximum of the H1 time and the biggest IMG time (or biggest background image if biggest IMG doesn't exist): <code>max(h1, (biggest_img || bg_img))</code>.</li> </ul> <p>&nbsp;</p> <h3>Evaluating rendering metrics</h3> <p>In order to evaluate the different rendering metrics, we recorded WebPageTest <a href="http://lab.speedcurve.com/rendering/picker.php">filmstrips for the world's top ~100 websites</a>. To make the evaluation more interactive (and fun), we created the <a href="http://lab.speedcurve.com/rendering/picker.php">rendering metrics Picker page</a>. It shows the screenshot that corresponds to each metric, but the metric names are hidden until you choose the one that corresponds to what you consider to be a "good UX". It keeps track of which metrics you're most aligned with. (If you want to see all the metrics without clicking on each filmstrip, just scroll to the bottom and click "Show All".)</p> <p style="text-align: center;"><a href="/img/blog/uxmetrics-picker5.png"><img style="max-width: 472px;" src="/img/blog/uxmetrics-picker5.png" alt="" width="100%" /></a></p> <p>I wish I could say "X is the best rendering metric", but it really depends on what you're after. Hopefully you went through the exercise of <a href="http://lab.speedcurve.com/rendering/picker.php">picking which rendering metric best corresponds to what you feel is a "good UX"</a>. For your site, you might be most interested in getting any content to the page as quickly as possible (Start Render). Or maybe you're interested in getting a significant amount of content to the page (First Meaningful Paint, Speed Index). Perhaps you care most about when critical content appears in the page (Hero Rendering Times).&nbsp;</p> <p>Regardless of the question of which rendering matters the most to you, there are a few criteria to keep in mind when evaluating these metrics.&nbsp;</p> <p><em>Does every pixel have the same value?</em></p> <p style="padding-left: 30px;">It's important to focus on rendering when it comes to delivering a good user experience. At SpeedCurve, we feel it's more than just rendering pixels - it's really about <em>rendering the most important pixels</em>. Not every part of the page has the same value. There are certain design elements - the call-to-action, the hero image, etc. - that are more important. A good metric should be able to measure the most important pixels when it comes to rendering.</p> <p><em>Automatic or requires work?</em></p> <p style="padding-left: 30px;">One of the reasons why <code>window.onload</code> is still the most-used performance metric is that it exists in all browsers by default - the website owner doesn't have to do any work to generate this metric. On the other hand, User Timing lets teams track metrics that matter the most to them, but it requires writing, pushing, and maintaining code to generate these metrics - which is probably why only ~5% of the world's top 500K websites use it. All other things being equal, there's a preference for metrics that work automatically.</p> <p><em>Synthetic or RUM?</em></p> <p style="padding-left: 30px;">Performance metrics are gathered either synthetically or via Real User Monitoring. Ideally, the metric of choice supports both. (Note: If a technique can be gathered by RUM it's considered available to synthetic as well, since synthetic monitoring solutions generally have access to JavaScript.)</p> <p>The following table categorizes each metric into the appropriate quadrant:</p> <table id="quad" style="margin: auto; margin-bottom: 1em;"> <tbody> <tr> <th style="background: #888; border: 1px solid #888; font-weight: bold; color: #eee; padding: 1em 1em; text-align: center;">&nbsp;</th> <th style="background: #888; border: 1px solid #888; font-weight: bold; color: #eee; padding: 1em 1em; text-align: center;">Requires Work</th> <th style="background: #888; border: 1px solid #888; font-weight: bold; color: #eee; padding: 1em 1em; text-align: center;">Automatic</th> </tr> <tr> <th style="background: #888; border: 1px solid #888; font-weight: bold; color: #eee; padding: 1em 1em; text-align: center;"> <div>Measures</div> <div>important</div> <div>pixels</div> </th> <td style="padding: 1em 1em; border: 1px solid; text-align: left; vertical-align: top;">User Timing (both)<br />Hero Element Timing (both)</td> <td style="padding: 1em 1em; border: 1px solid; text-align: left; vertical-align: top;">Hero Rendering Times (syn)</td> </tr> <tr> <th style="background: #888; border: 1px solid #888; font-weight: bold; color: #eee; padding: 1em 1em; text-align: center;">All pixels<br />the same</th> <td style="padding: 1em 1em; border: 1px solid; text-align: left; vertical-align: top;">User Timing (both)</td> <td style="padding: 1em 1em; border: 1px solid; text-align: left; vertical-align: top;">Speed Index (syn)<br />Start Render (syn)<br />Time to First Interactive (syn)<br />Time to Consistently Interactive (syn)<br />Visually Complete (syn)<br />First Paint (both)<br />First Contentful Paint (both)<br />First Meaningful Paint (syn)</td> </tr> </tbody> </table> <p>We're pretty excited about Hero Rendering Times. It uses heuristics to estimate which content is critical (H1, hero image, and largest background image). It's available without the website owner having to do any extra work, which means it can also track competitor websites. And it scores well in the subjective results from <a href="http://lab.speedcurve.com/rendering/picker.php">"which metric best approximates a good UX"</a>. However, it's only available in synthetic monitoring.</p> <p>There isn't a good rendering metric available in RUM. There are only three choices right now: First Paint, First Contentful Paint, and User Timing. The results in our examples for First Paint and First Contentful Paint don't map well to actual screen content. This is probably due to the fact that Chrome doesn't know when the pixels actually get painted to the screen. For synthetic results we could round up to the next painted thumbnail, but it's not possible to make this adjustment for RUM. Perhaps website owners could always add an offset, but in our results the delta ranged from 100ms to 3 seconds.&nbsp;</p> <p>User Timing is the third alternative for RUM. The good thing about User Timing is it can be used to measure the rendering time for the critical content in the page, but this requires using <a href="/blog/user-timing-and-custom-metrics/">special techniques</a> that are tricky at best. In addition, it's possible that the results suffer from a similar delta delay as we see with First Paint and First Contentful Paint. (This is an area for further research.)</p> <p><a href="https://docs.google.com/document/d/1sBM5lzDPws2mg1wRKiwM0TGFv9WqI6gEdF7vYhBYqUg/edit">Hero Element Timing</a> is a fourth candidate for RUM rendering metrics, but it's in the early proposal stages and not currently available in any browser. And again, it's likely that this metric would suffer from the same delta delay as the others discussed previously.</p> <h3>What's next</h3> <p>There's work to do in rendering metrics for RUM. First Paint and First Contentful Paint don't necessarily correspond to a "good UX" (i.e., critical content). Hero Element Timing will be extremely useful for tracking critical content in RUM once browsers support it.&nbsp;</p> <p>The question of measuring "meaningful" content is an area for more research. In our experience with the <a href="http://lab.speedcurve.com/rendering/picker.php">Picker</a>, First Meaningful Paint often doesn't match the point where critical content is rendered. Hero Rendering Times does better at identifying when critical content hits the screen, but isn't without flaws. Its calculations are based on analyzing the filmstrip screenshot images. Rotating content and pop-ups are a challenge, as is transparent H1 elements that overlay hero images and background images. Identifying critical content without requiring website owners to modify their code is an exciting goal for future work.</p> <p>Further down the road it'd be great to get more CPU information for RUM possibly from the <a href="https://w3c.github.io/longtasks/">Long Tasks API</a>. This&nbsp;could help developers diagnose why their rendering metrics have changed, especially if timing information can be associated with individual scripts and stylesheets.&nbsp;</p> <p>In this blog post I focused on rendering metrics and haven't spent much time on the interactive metrics (Time to First Interactive and Time to&nbsp;Consistently&nbsp;Interactive). It's important that these interactivity metrics&nbsp;incorporate a rendering metric as a baseline. Currently, they rely on First Contentful Paint but other rendering metrics should also be considered, especially Hero Rendering Times since it's performed well in our studies.&nbsp;</p> Mon, 11 Dec 2017 00:00:00 +1300 By popular demand: Multiple Favorites dashboards! https://speedcurve.com/blog/multiple-favorites-dashboards <p>Rolling out new features is always a blast, and it's extra rewarding when the new feature is a response to a customer request. We've had&nbsp;many&nbsp;conversations with SpeedCurve users who've told us that&nbsp;multiple Favorite dashboards would be a huge benefit for their teams.&nbsp;</p> <p style="text-align: center;"><img style="max-width: 600px; width: 100%;" src="https://img.speedcurve.com/blog/favorites-chat.png?w=799&amp;auto=format,compress" sizes="(max-width: 600px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/favorites-chat.png?w=300&amp;auto=format,compress 300w, https://img.speedcurve.com/blog/favorites-chat.png?w=400&amp;auto=format,compress 400w, https://img.speedcurve.com/blog/favorites-chat.png?w=600&amp;auto=format,compress 600w, https://img.speedcurve.com/blog/favorites-chat.png?w=799&amp;auto=format,compress 799w" alt="Favorites Chat" /></p> <p>Today, we're very excited to announce that multiple Favorites dashboards are now available. Here's why you need them and how to create them.</p><h2>Who needs multiple Favorites dashboards?</h2> <p>The ability to create multiple Favorites dashboards is a huge boon <strong>for organizations that have many different teams and projects</strong> on the go at any given time. They're also helpful if you need to <strong>curate charts for different audiences</strong>.&nbsp;</p> <p>For example, if you need to do regular performance presentations at monthly management meetings, you can curate high-level charts in an "Executive Summary" dashboard. Each dashboard also allows you to generate a "share" URL &ndash; which can be sent to non-users as well &ndash; so you can also share individual dashboards via email or on a display monitor.</p> <p>Within your performance team, you can create specific dashboards for separate projects. For example, if you're using custom timers to track ads on your pages, you can create a dashboard called "Third Party Ads". And so on.&nbsp;</p> <p style="text-align: center;"><img style="max-width: 1200px; width: 100%;" src="https://img.speedcurve.com/blog/favorites-dashboards.png?w=1200&amp;auto=format,compress" sizes="(max-width: 1200px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/favorites-dashboards.png?w=300&amp;auto=format,compress 300w, https://img.speedcurve.com/blog/favorites-dashboards.png?w=400&amp;auto=format,compress 400w, https://img.speedcurve.com/blog/favorites-dashboards.png?w=600&amp;auto=format,compress 600w, https://img.speedcurve.com/blog/favorites-dashboards.png?w=1000&amp;auto=format,compress 1000w, https://img.speedcurve.com/blog/favorites-dashboards.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/favorites-dashboards.png?w=1800&amp;auto=format,compress 1800w" alt="Favorites Dashboards" /></p> <h2>Why you need custom charts</h2> <p>We think our curated charts, which are available by default with your SpeedCurve plan, are pretty great. We've put a lot of thought into creating visualizations that are as meaningful as possible.</p> <p>But you know your own business better than we do. By building custom charts, you can&nbsp;<strong>cherry pick the metrics and data that are most&nbsp;important to your business and track them over time</strong>.</p> <p>Custom charts let you do things like:</p> <ul> <li>Combine&nbsp;multiple metrics</li> <li>Combine synthetic&nbsp;and LUX (real user monitoring) data in one&nbsp;place</li> <li>Choose average, median, or 95th percentile</li> <li>Select multiple values for a filter (e.g., browser = Chrome or Firefox, country = UK or US)</li> <li>Compare A/B tests in a single chart</li> </ul> <h2>Getting started</h2> <p><strong>If you&rsquo;re already a SpeedCurve user:</strong>&nbsp;Creating multiple Favorites dashboards is easy! You can get started in minutes. Check out our short tutorial that walks you through the process for <a href="http://support.speedcurve.com/get-the-most-out-of-speedcurve/create-custom-dashboards-and-charts">creating custom dashboards and charts</a>.&nbsp;</p> <p><strong>If you&rsquo;re not a SpeedCurve user:&nbsp;</strong> <a href="https://speedcurve.com/plan/trial/">Sign up for your free trial</a>&nbsp;and start creating your own custom charts and dashboards.</p> <h2>How have custom performance charts helped you?&nbsp;</h2> <p>We'd love to&nbsp;know what kind of custom charts you've created, and how they've helped your performance team and your company. Let us know in the comments, or email us at support@speedcurve.com.</p> Thu, 02 Nov 2017 00:00:00 +1300 Engagement charts: See correlations between performance and user engagement https://speedcurve.com/blog/web-performance-monitoring-user-engagement <p>One of the best &ndash; and worst &ndash; things about real user monitoring is that it gives you unparalleled access to massive amounts of user data. The problem is when&nbsp;all this data leads to&nbsp;data indigestion. How do you know where to begin? And how do you know what to leave out in order to present a clear case for performance?</p> <p>At SpeedCurve, we care about more than just showing you all your data. We want to show you the <em>most important</em> data. And we want to make it easy for you to share that data with people throughout your organization. <strong>That&rsquo;s why we&rsquo;re excited about the newest addition to our family of visualizations: engagement&nbsp;charts.</strong>&nbsp;</p> <p style="text-align: center;"><img style="max-width: 1200px;" src="https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=1200&amp;auto=format,compress" sizes="(max-width: 1200px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=682&amp;auto=format,compress 682w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=972&amp;auto=format,compress 972w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=1188&amp;auto=format,compress 1188w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=1250&amp;auto=format,compress 1250w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-01.png?w=1689&amp;auto=format,compress 1689w" alt="Load Time vs Bounce Rate" width="100%" /></p><h2>What are engagement charts?</h2> <p>Engagement charts&nbsp;&ndash; which are generated by the RUM data gathered by&nbsp;<a href="https://speedcurve.com/features/lux/">SpeedCurve LUX</a>&nbsp;&ndash; are the first&nbsp;member in our new family of <strong>correlation charts</strong>. (We'll be introducing new members of the family down the road, but for today, let's focus on engagement.)</p> <p>Engagement charts&nbsp;give you a histogram view of all your&nbsp;user&nbsp;traffic, broken out into cohorts based on start render and load time. You also get an overlay that shows you the bounce rate that correlates to each of these cohorts. This lets you see at a glance the relationship between page speed and user engagement. (Spoiler alert: The dominant trend is that as pages get slower, bounce rate gets worse.)</p> <p style="text-align: center;"><img style="max-width: 1200px;" src="https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=1200&amp;auto=format,compress" sizes="(max-width: 1200px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=682&amp;auto=format,compress 682w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=972&amp;auto=format,compress 972w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=1188&amp;auto=format,compress 1188w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=1250&amp;auto=format,compress 1250w, https://img.speedcurve.com/blog/lux-load-time-vs-bounce-rate-02.png?w=1689&amp;auto=format,compress 1689w" alt="Load Time vs Bounce Rate" width="100%" /></p> <p><strong>&gt;&gt; Demo:</strong> <a href="https://speedcurve.com/webpagetest/lux-perf/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median">Interact with engagement charts in our live LUX demo account</a></p> <h2>Why you need them</h2> <p>Engagement charts&nbsp;are a great way to communicate about performance to a business audience. These visualizations let even the most non-technical stakeholder easily see the correlation between performance and user engagement. In my experience with talking about performance to a&nbsp;wide variety of audiences, graphs like this (which I&rsquo;ve manually created the old-fashioned way in the past) can be extremely effective in winning performance buy-in.&nbsp;</p> <p>But wait&hellip; there&rsquo;s more!&nbsp;</p> <h2>Spot&nbsp;performance-blocking trends&nbsp;</h2> <p>We&rsquo;ve created overlays that let you see the correlation between blocking JavaScript and CSS with your other metrics.</p> <p style="text-align: center;"><img style="max-width: 1200px;" src="https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=1200&amp;auto=format,compress" sizes="(max-width: 1200px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=682&amp;auto=format,compress 682w, https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=972&amp;auto=format,compress 972w, https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=1188&amp;auto=format,compress 1188w, https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=1250&amp;auto=format,compress 1250w, https://img.speedcurve.com/blog/lux-start-render-vs-bounce-rate-02.png?w=1689&amp;auto=format,compress 1689w" alt="Load Time vs Bounce Rate" width="100%" /></p> <p>This lets you spot trends on your pages &ndash; for example, in the sample graph above, you can see that while there are fewer blocking resources on the faster pages, this number takes a sharp upturn starting with the cohort of pages that&nbsp;have a start render time&nbsp;of&nbsp;1.1&nbsp;seconds. If your goal is to deliver faster start render times to more users (and 1.1 seconds is a pretty good goal to shoot for), then this might trigger you to do an audit of your pages to analyze how your scripts and stylesheets are being executed.&nbsp;</p> <h2>Get started</h2> <p><strong>If you&rsquo;re already a SpeedCurve LUX user:</strong>&nbsp;Engagement charts are available by default at the top of your LUX Performance Dashboard. Use the arrow icon in the top right corner of the dashboard to easily share them with your team members and other folks in your organization.&nbsp;</p> <p><strong>If you're&nbsp;a SpeedCurve Synthetic user, but haven't tried LUX yet:</strong> Activating your LUX trial is easy: all you have to do is grab the LUX ID for your team (available in the Admin&gt;Teams panel), <a href="https://speedcurve.com/features/lux/#snippet">install the&nbsp;lux.js snippet on your site</a>, and let us know when it&rsquo;s live so that we can turn on your trial.</p> <p><strong>If you&rsquo;re not a&nbsp;SpeedCurve user: </strong>Explore engagement charts in our <a href="https://speedcurve.com/webpagetest/lux-perf/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median">live LUX demo account</a>, then&nbsp;<a href="https://speedcurve.com/plan/trial/">sign up for your free trial</a>&nbsp;and get these graphs for your own site.</p> <h2>How would you use engagement and correlation charts?</h2> <p>As always, we&rsquo;d love to hear your feedback and suggestions for iterating on these charts. Which metrics would you love to see by default, and why? Let us know in the comments, reply to our <a href="https://twitter.com/SpeedCurve/status/923657181513125888" target="_blank">Twitter announcement</a>, or send us a note at <a href="mailto:support@speedcurve.com">support@speedcurve.com</a>.</p> Thu, 26 Oct 2017 00:00:00 +1300 Keeping track of performance changes https://speedcurve.com/blog/web-performance-keeping-track-of-changes <p>Being able to track which changes have an impact &ndash; either positive or negative &ndash; on your site&rsquo;s performance is an important part of performance monitoring that can provide valuable feedback to your team. We wanted to make it easier to see at a glance all the changes to your site, without the cognitive overhead of interpreting charts. That&rsquo;s why we created the new Changes dashboard, which gives you a newsfeed-style overview of recent activity in your SpeedCurve account.</p> <p>Your Changes dashboard shows your&nbsp;<a href="https://speedcurve.com/blog/performance-budgets-in-action/">performance budget</a> alerts, deploys, site notes, and SpeedCurve product updates:</p> <p><img src="https://img.speedcurve.com/blog/changes-overview.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/changes-overview.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/changes-overview.png?w=682&amp;auto=format,compress 682w, https://img.speedcurve.com/blog/changes-overview.png?w=972&amp;auto=format,compress 972w, https://img.speedcurve.com/blog/changes-overview.png?w=1188&amp;auto=format,compress 1188w, https://img.speedcurve.com/blog/changes-overview.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/changes-overview.png?w=1250&amp;auto=format,compress 1250w" alt="Changes dashboard (overview)" width="100%" /></p><p>The Changes dashboard is designed to be quickly scanned for changes that are relevant to you. Everything is ordered chronologically to make it easy to correlate changes, and each change can be expanded to reveal more detail.</p> <p><img src="https://img.speedcurve.com/blog/changes-expanded.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/changes-expanded.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/changes-expanded.png?w=682&amp;auto=format,compress 682w, https://img.speedcurve.com/blog/changes-expanded.png?w=972&amp;auto=format,compress 972w, https://img.speedcurve.com/blog/changes-expanded.png?w=1188&amp;auto=format,compress 1188w, https://img.speedcurve.com/blog/changes-expanded.png?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/changes-expanded.png?w=1250&amp;auto=format,compress 1250w" alt="Changes dashboard (expanded view)" width="100%" /></p> <p>To save you the trouble of checking back for updates, we show a small notification in the navigation bar whenever there are any new changes for your sites:</p> <p style="text-align: center;"><img src="https://img.speedcurve.com/blog/changes-menu-notification.png?w=170&amp;auto=format,compress" alt="" width="170" height="210" /></p> <h2>Get started</h2> <p>The Changes dashboard is a great place to keep track of performance changes across your sites. If you're already a SpeedCurve user, you can start exploring this feature right away. If you're not yet a SpeedCurve user, sign up for your <a href="https://speedcurve.com/plan/trial/">free trial</a> and check it out.</p> Wed, 11 Oct 2017 00:00:00 +1300 A retailer's guide to web performance https://speedcurve.com/blog/retail-guide-web-performance <p>I&rsquo;m at Shop.org this week, having really interesting conversations with online retailers. What I love about talking with this crowd is that &ndash; like me &ndash; they're super&nbsp;focused on user-perceived performance. Not surprisingly, we have a lot to talk about.</p> <p>Making customers happy is the not-so-secret secret to retail success. Delivering a fast, consistent online experience has been proven&nbsp;to measurably increase every metric retailers care about &ndash; from conversions and revenue to retention and brand perception. (In fact, there's so much research in this area, I dedicated an entire chapter in <a href="https://tammyeverts.wordpress.com/2016/06/06/woohoo-my-book-is-out/" target="_blank">my book</a> to it. You can also find a number of great studies on <a href="https://wpostats.com/" target="_blank">WPO Stats</a>.)</p> <p>Delivering great, fast&nbsp;online experiences starts with asking two questions:</p> <ul> <li>What&rsquo;s making my pages seem slower <strong>for my users</strong>?</li> <li>What can I do about it?</li> </ul> <p>The good news is that most of the issues that are making pages slow for your shoppers are right on your pages, which means you have control over them. Here's an overview of the most common performance issues on retail sites, and how you can track them down and fix them.&nbsp;</p><h2><strong>What's making my pages seem slower?</strong></h2> <p>I&rsquo;ve analyzed hundreds (and possibly thousands) of retail web pages over the past several years. In my experience, the vast majority of performance issues are caused by four things:</p> <ul> <li>Third parties, such as trackers and analytics</li> <li>Stylesheets</li> <li>Custom fonts</li> <li>Page size, particularly image size</li> </ul> <h3><strong>Third parties&nbsp;</strong></h3> <p>A typical retail web page these days&nbsp;can contain upwards of 75 third-party scripts, such as trackers and analytics beacons. Third parties add tons of value by increasing conversions (via targeting beacons) and helping you understand your users in unprecedented ways (via analytics tags), so they&rsquo;re not going away any time soon. But as pretty much everyone knows by now, they can really affect how your page renders.&nbsp;</p> <h4><strong>What you can do: Monitor the speed of your third parties</strong></h4> <p>Start by&nbsp;taking a proactive approach to understanding&nbsp;any potential performance damage your third parties can&nbsp;cause. You can't fix what you're not measuring, which is why we built a <a href="https://speedcurve.com/features/synthetic/#thirdparty">third-party waterfall chart</a> into SpeedCurve, so you can see at a glance how your third parties are performing.&nbsp;</p> <p style="text-align: center;"><img style="width: 100%; max-width: 1000px;" src="https://img.speedcurve.com/blog/retail_1.png?w=1226&amp;auto=format" sizes="(max-width: 1000px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/retail_1.png?w=613auto=format 613w, https://img.speedcurve.com/blog/retail_1.png?w=1226&amp;auto=format 1226w" alt="" /></p> <p><strong>Read &gt;</strong> <a href="https://speedcurve.com/blog/ux-focus-for-waterfalls-and-third-parties/">UX focus for third parties</a></p> <p><strong>Case study &gt;</strong> <a href="https://www.youtube.com/watch?v=LHlmJIjhzoM#t=23m29s" target="_blank">Marks &amp; Spencer revolutionized performance by focusing on third party content</a>&nbsp;</p> <p><strong>Live demo account &gt;</strong> <a href="https://speedcurve.com/demo/thirdparty/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">SpeedCurve Third Party Dashboard</a></p> <h3><strong>Stylesheets</strong></h3> <p>Stylesheets are an incredible boon for modern webpages. They solve a myriad of design problems, from browser compatibility to design maintenance and updating. Without stylesheets, we wouldn&rsquo;t have great things like responsive design. However, poorly executed stylesheets can create a host of performance problems. These range from CSS&nbsp;that takes too long to download and parse, to improperly placed stylesheets&nbsp;that blocks the rest of the page from rendering.&nbsp;</p> <h4><strong>What you can do: Know which of your stylesheets can block your pages from rendering&nbsp;</strong></h4> <p>Again, you can't fix what you don't measure. We've made it easy for you to find out if your pages have critical blocking resources, such as CSS and JavaScript. This chart is available on your <a href="https://speedcurve.com/demo/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">Site dashboard</a> and lets you quickly spot any issues.</p> <p style="text-align: center;"><img style="width: 100%; max-width: 1000px;" src="https://img.speedcurve.com/blog/retail_2.png?w=1030&amp;auto=format" sizes="(max-width: 1000px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/retail_2.png?w=515auto=format 515w, https://img.speedcurve.com/blog/retail_2.png?w=1030&amp;auto=format 1030w" alt="" /></p> <p style="text-align: left;"><strong>Read &gt;</strong> <a href="https://speedcurve.com/blog/measuring-blocking-resources/">Measuring blocking resources</a>&nbsp;</p> <p style="text-align: left;"><strong>Live demo account &gt;</strong> <a href="https://speedcurve.com/demo/site/?b=apple-ipad&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">SpeedCurve Site Dashboard</a></p> <h3><strong>Custom fonts</strong></h3> <p>Custom fonts allow designers unprecedented control over the typefaces used in their designs. This desire for control accounts for the surge in popularity for custom fonts. In 2010, only 1% of the top 1,000 websites used custom fonts. Today, that number has grown to 65%.</p> <p>This popularity comes with a performance price tag. Some fonts require huge amounts of CSS code, while others have heavy JavaScript or are hosted externally  &ndash;  all of which can dramatically slow down page rendering.</p> <h4><strong>What you can do: Track how quickly your fonts&nbsp;render</strong></h4> <p>SpeedCurve&rsquo;s new Hero Rendering Times are a set of metrics that measure when a page's most important content finishes rendering in the browser. H1 Render is one of these metrics. (I'll be talking about the other metrics later in this post.) It measures when your first H1 element finishes rendering. If a site uses custom fonts, it's quite likely that those fonts will be applied to H1 copy, which makes this metric a great way to measure how quickly your custom fonts are rendering.&nbsp;</p> <p style="text-align: center;"><img style="width: 100%; max-width: 350px;" src="https://img.speedcurve.com/blog/retail_3.png?w=479&amp;auto=format" sizes="(max-width: 350px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/retail_3.png?w=239auto=format 239w, https://img.speedcurve.com/blog/retail_3.png?w=479&amp;auto=format 479w" alt="" /></p> <p><strong>Read &gt;</strong> <a href="https://speedcurve.com/blog/web-performance-monitoring-hero-times/">Hero Rendering Times: New metrics for measuring UX</a></p> <p><strong>Case study &gt;</strong> <a href="https://medium.com/@francis.john/web-font-optimization-at-nerdwallet-6a447be9b570" target="_blank">NerdWallet used the H1 Render metric to help improve font loading by up to 30%</a></p> <p><strong>Live demo account &gt;</strong>&nbsp;<a href="https://speedcurve.com/demo/site/?b=apple-ipad&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">SpeedCurve Site Dashboard</a></p> <h3><strong>Images and page size</strong></h3> <p>I&rsquo;ve written about page bloat a lot over the years (most recently in this post). While page size doesn&rsquo;t always correlate to a slower user experience, it often does. Huge unoptimized images are a frequent culprit. I&rsquo;ve seen retail pages that contained hero images that were up to 5MB in size. That&rsquo;s a lot of bytes, folks.</p> <h4><strong>What you can do: Create&nbsp;performance budgets&nbsp;</strong></h4> <p><a href="https://speedcurve.com/features/synthetic/#budgets">Performance budgets</a> are a great way to manage page bloat. A performance budget starts with your team (everybody: marketing, designers and developers) agreeing on the principles around the user experience and how fast your website should feel.</p> <p>You define a budget for each metric, such as the total size of your JavaScript, how many images should be on the page, and how quickly the page should start rendering. Once you define your budget, SpeedCurve starts monitoring and alerts you if the target budget is exceeded.</p> <p style="text-align: center;"><img style="width: 100%; max-width: 1000px;" src="https://img.speedcurve.com/blog/retail_4.png?w=1000&amp;auto=format" sizes="(max-width: 1000px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/retail_4.png?w=500&amp;auto=format 500w, https://img.speedcurve.com/blog/retail_4.png?w=1000&amp;auto=format 1000w, https://img.speedcurve.com/blog/retail_4.png?w=2000&amp;auto=format 2000w" alt="" /></p> <p><strong>Read &gt;</strong> <a href="https://speedcurve.com/blog/performance-budgets-in-action/">Performance budgets in action</a></p> <p><strong>Case study &gt;</strong> <a href="https://www.zillow.com/engineering/bigger-faster-more-engaging-budget/">How Zillow became bigger, faster, and more engaging while on a budget</a></p> <p><strong>Live demo account &gt;</strong>&nbsp;<a href="https://speedcurve.com/demo/site/?b=apple-ipad&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">SpeedCurve Site Dashboard</a></p> <h4><strong>What you can do (part deux): Track the speed of your hero images</strong></h4> <p>We&rsquo;ve also made it easy for you to see at a glance how quickly your hero images render. For example, the Largest Image Render metric identifies when the largest image in the viewport finishes rendering. This metric is especially relevant to retail sites, where hero images on home, product, and campaign landing pages are critical elements.&nbsp;</p> <p style="text-align: center;"><img style="width: 100%; max-width: 500px;" src="https://img.speedcurve.com/blog/retail_5.png?w=500&amp;auto=format" sizes="(max-width: 500px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/retail_5.png?w=500&amp;auto=format 500w, https://img.speedcurve.com/blog/retail_5.png?w=917&amp;auto=format 917w" alt="" /></p> <p><strong>Read &gt;</strong> <a href="https://speedcurve.com/blog/web-performance-monitoring-hero-times/">Hero Rendering Times: New metrics for measuring UX</a></p> <p><strong>Live demo account &gt;</strong>&nbsp;<a href="https://speedcurve.com/demo/site/?b=apple-ipad&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">SpeedCurve Site Dashboard</a></p> <h2><strong>Get started</strong></h2> <p>Delivering fast, joyous experiences to online shoppers has never been as important as it is now. If you're already a SpeedCurve user, you can take advantage of the many ways to make your site feel faster for your users. If you're not already a SpeedCurve user, <strong><a href="https://speedcurve.com/demo/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">explore our live demo account</a></strong>,&nbsp;<a href="https://speedcurve.com/plan/trial/"><strong>sign up for your free trial</strong></a> so you can explore these features and get to know your site better &ndash; the way your users see it.</p> Thu, 28 Sep 2017 00:00:00 +1300 Woohoo! I'm helping build SpeedCurve https://speedcurve.com/blog/woohoo-helping-build-speedcurve <p>I&rsquo;m super excited to be able to say that I&rsquo;ve joined Mark, Steve, and Tammy at SpeedCurve!</p> <p>I&rsquo;ve watched how Mark has shown over the last couple of years that performance monitoring doesn&rsquo;t have to be dry and data-heavy; it can be insightful, interactive, and actionable. I&rsquo;ve also been a follower of Steve&rsquo;s work for many years. In fact, I should probably thank Steve for providing me with the knowledge that got me interested in web performance in the first place! Tammy&rsquo;s work has been really interesting to follow, too - her focus on real people and how web performance impacts the way they use our websites is something that resonates strongly with me.</p> <p style="margin-bottom: 0px;"><img src="https://img.speedcurve.com/blog/joseph-bbc.jpg?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/joseph-bbc.jpg?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/joseph-bbc.jpg?w=682&amp;auto=format,compress 682w, https://img.speedcurve.com/blog/joseph-bbc.jpg?w=972&amp;auto=format,compress 972w, https://img.speedcurve.com/blog/joseph-bbc.jpg?w=1188&amp;auto=format,compress 1188w, https://img.speedcurve.com/blog/joseph-bbc.jpg?w=1200&amp;auto=format,compress 1200w, https://img.speedcurve.com/blog/joseph-bbc.jpg?w=1900&amp;auto=format,compress 1900w" alt="Joseph Wynn" width="100%" /></p> <p style="font-size: 12px; text-align: center;">Joseph making BBC News way faster for all users.</p><p>For the last 3 years I worked at BBC News as a Principal Software Engineer. The BBC News website is accessed by 10 million people every day - people from all around the world using every conceivable device on all sorts of network connections. I always felt that it was important to understand whether or not all of those people were having a good experience when they visited our website.</p> <p>I got a glimpse of what sort of experiences people were having every time I went travelling. In rural Scotland, BBC News pages would take up to a minute to load. When I visited Morocco the connection would time out before I saw any content. In New Zealand the pages would initially load quickly but then the content would jump around while adverts were being loaded. But this was all anecdotal and I had no way to back it up empirically.</p> <p>We trialled several performance monitoring tools at the BBC, but I was always frustrated that they were unable to give a simple answer to questions like: How fast are our pages? Are they getting faster or slower? What should we work on next to improve performance? When I was introduced to SpeedCurve, this all changed. The important data is presented in a way that&rsquo;s easy to understand and -more importantly- easy to communicate to non-technical stakeholders.</p> <p>I&rsquo;ve always believed that <a href="https://www.youtube.com/watch?v=nE4LTRfcr94">performance is not a technical problem</a> - that the hardest part of making a website fast is educating other people about the impact that performance has on users and on the business. That&rsquo;s why I&rsquo;m really excited to help build what I think is the best tool available for doing that.</p> Tue, 12 Sep 2017 00:00:00 +1200 Waterfall with browser events https://speedcurve.com/blog/waterfall-with-browser-events <p>We've improved our already fantastic interactive waterfall chart with a new collapsed mode that highlights all the key browser events. This lets you quickly scan all the events that happen as the page loads and if you scrub your mouse across the waterfall you can easily correlate each event to what the user could see at that moment.</p> <p>Along with all the browser metrics you also get to see our new <a href="/blog/web-performance-monitoring-hero-times/">hero rendering times</a> in context. Click on any event to see a large version of that moment in the filmstrip.</p> <p><video autoplay="autoplay" loop="loop" width="100%"><source src="https://assets.speedcurve.com/img/blog/waterfall-mini.mp4" type="video/mp4" /></video></p><p>If you want to dig into the detail of the network requests and how they relate to the browser events, just click "Expand" or on the background of the waterfall chart.</p> <p>We've now made it even easier to correlate network requests, browser events and browser main thread with what the user is actually seeing as the page loads. All your web performance debugging goodness in one powerful interactive tool!</p> <p>If you're already a SpeedCurve user, you can start exploring this feature right away. If you're not yet a SpeedCurve user, sign up for your <a href="/plan/trial/">free trial</a> and check it out.</p> Fri, 08 Sep 2017 00:00:00 +1200 Hero Rendering Times: New metrics for measuring UX https://speedcurve.com/blog/web-performance-monitoring-hero-times <p>The key to a good user experience is quickly delivering the content your visitors care about the most. This is easy to say, but tricky to do. Every site has&nbsp;unique content and user engagement goals, which is why measuring how fast critical content renders has historically been a challenging task.</p> <p><strong>That's why we're very excited to introduce Hero Rendering Times, a set of new metrics for measuring the user experience. </strong>Hero Times measure when a page's most important content finishes rendering in the browser. These metrics are available right now to SpeedCurve users.&nbsp;</p> <p><a href="/speedcurve-enterprise/top-sites/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=20637&amp;u=41165&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3" target="_blank" rel="noopener"><img style="width: 100%; max-width: 1200px;" src="https://img.speedcurve.com/blog/hero-main.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/hero-main.png?w=250&amp;auto=format,compress 200w, https://img.speedcurve.com/blog/hero-main.png?w=533&amp;auto=format,compress 533w, https://img.speedcurve.com/blog/hero-main.png?w=772&amp;auto=format,compress 772w, https://img.speedcurve.com/blog/hero-main.png?w=959&amp;auto=format,compress 959w, https://img.speedcurve.com/blog/hero-main.png?w=1169&amp;auto=format,compress 1169w, https://img.speedcurve.com/blog/hero-main.png?w=1328&amp;auto=format,compress 1328w, https://img.speedcurve.com/blog/hero-main.png?w=1464&amp;auto=format,compress 1464w, https://img.speedcurve.com/blog/hero-main.png?w=1639&amp;auto=format,compress 1639w, https://img.speedcurve.com/blog/hero-main.png?w=1788&amp;auto=format,compress 1788w, https://img.speedcurve.com/blog/hero-main.png?w=1926&amp;auto=format,compress 1926w, https://img.speedcurve.com/blog/hero-main.png?w=2069&amp;auto=format,compress 2069w, https://img.speedcurve.com/blog/hero-main.png?w=2199&amp;auto=format,compress 2199w, https://img.speedcurve.com/blog/hero-main.png?w=2400&amp;auto=format,compress 2400w" alt="Hero Rendering Times" /></a></p> <p>More on how Hero Rendering Times work further down in this post. But first, I want to give a bit of back story that explains how we got to here.</p><h2>A brief history of UX metrics</h2> <p><strong>In the beginning, there was load time.</strong> But then we realized that there was too much stuff on pages (e.g., third parties, outside-the-viewport content) that resulted in long load times, and these <a href="https://www.stevesouders.com/blog/2013/05/13/moving-beyond-window-onload/">long load times didn't actually reflect how fast pages felt to users</a>.</p> <p><strong>Start render is better than load time</strong>, because it measures when content starts to render &ndash; and when users can ostensibly begin to interact with the page. The other advantage is that it can be used in synthetic, so it's a good-enough way to compare the UX of your site to your competitors. But start render isn't ideal, because it only measures the <em>beginning</em> of content rendering, not when users can actually engage meaningfully with the page.</p> <p><strong>Then Speed Index came along.</strong> This metric, which is measured in <a href="https://www.webpagetest.org/">WebPageTest</a>, identifies when the visible parts of a page are displayed. This was a huge evolutionary leap in that it represented the first time any tool attempted to tackle the issue of measuring what users actually see. <a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index#TOC-Measuring-Visual-Progress">Speed Index is based on measuring when visual content (e.g., images and video) render within the viewport.</a></p> <p>We like Speed Index (which is why <a href="/blog/measuring-the-user-experience/">we've included it in SpeedCurve</a>), but because it's dependent on how the page is built, it's not a one-size-fits-all metric. For example, I recently spoke with a customer who was getting confusing Speed Index results for mobile. It turned out that&nbsp;the reason why their Speed Index was fast &ndash; despite the fact that their viewport was almost empty &ndash; was because most of their "above the fold" content was not image-based.</p> <p><strong>Recently, metrics like Time to Interact (TTI) and Time to First Meaningful&nbsp;Paint (TTFMP) have gotten a lot of attention.</strong> But TTI doesn't consistently and accurately measure user experience. And while TTFMP&nbsp;&ndash; which is available through the new <a href="https://blog.chromium.org/2017/06/chrome-60-beta-paint-timing-api-css.html">Paint Timing API</a> &ndash; does illustrate when content becomes visible in the browser, its weakness is that, like Start Render and Speed Index, it gives equal value to every pixel. In other words, it doesn't discriminate between useful and non-useful content. (This is a hugely fascinating topic for discussion, which is why I'll be talking more about these metrics in an upcoming post.)</p> <p><strong><a href="/blog/user-timing-and-custom-metrics/">Custom metrics are a great solution</a></strong>&nbsp;(and they remain the best solution for real user monitoring), but they require additional dev time and expertise, which might be why only 14% of sites use them.</p> <h2>We need better metrics for measuring user&nbsp;experience</h2> <p>Given the constraints and limitations of existing metrics, we realized we need a solution that:</p> <ul> <li>Correlates to what users actually see in the browser.</li> <li>Recognizes that not all pixels and page elements are equal, from a user's&nbsp;perspective.</li> <li>Allows us to customize what we measure on specific pages.</li> <li>Is easy to use and accessible right out of the box.</li> </ul> <h2>Introducing&nbsp;Hero Rendering Times</h2> <p>Here's the great news: You don't have to do anything at all to get started! <strong>If you're a SpeedCurve user, these&nbsp;core Hero Rendering Times are already sitting in your Sites&nbsp;dashboard.</strong> If you're not a SpeedCurve user, click on each of the images below to check out these metrics in our live demo dashboards.&nbsp;</p> <h3><strong>Largest Image&nbsp;Render&nbsp;</strong></h3> <p>Just as its name suggests, Largest Image&nbsp;Render identifies when the largest image in the viewport finishes rendering. This metric&nbsp;is especially relevant to retail sites, where images on home, product, and campaign landing pages are critical elements.</p> <p><a href="/speedcurve-enterprise/top-sites/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=38668&amp;u=73840&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3" target="_blank" rel="noopener"><img style="width: 100%; max-width: 1200px;" src="https://img.speedcurve.com/blog/hero-image.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/hero-image.png?w=250&amp;auto=format,compress 200w, https://img.speedcurve.com/blog/hero-image.png?w=533&amp;auto=format,compress 533w, https://img.speedcurve.com/blog/hero-image.png?w=772&amp;auto=format,compress 772w, https://img.speedcurve.com/blog/hero-image.png?w=959&amp;auto=format,compress 959w, https://img.speedcurve.com/blog/hero-image.png?w=1169&amp;auto=format,compress 1169w, https://img.speedcurve.com/blog/hero-image.png?w=1328&amp;auto=format,compress 1328w, https://img.speedcurve.com/blog/hero-image.png?w=1464&amp;auto=format,compress 1464w, https://img.speedcurve.com/blog/hero-image.png?w=1639&amp;auto=format,compress 1639w, https://img.speedcurve.com/blog/hero-image.png?w=1788&amp;auto=format,compress 1788w, https://img.speedcurve.com/blog/hero-image.png?w=1926&amp;auto=format,compress 1926w, https://img.speedcurve.com/blog/hero-image.png?w=2069&amp;auto=format,compress 2069w, https://img.speedcurve.com/blog/hero-image.png?w=2199&amp;auto=format,compress 2199w, https://img.speedcurve.com/blog/hero-image.png?w=2400&amp;auto=format,compress 2400w" alt="Largest Image Rendering Time" /></a></p> <h3><strong>H1 Render</strong>&nbsp;</h3> <p>H1 Render measures when your first H1 element finishes rendering. This metric is especially useful&nbsp;to media and informational sites. Because the&nbsp;H1 tag is usually wrapped around header copy, there's a reasonable assumption that this is copy you want your users to see quickly.</p> <p><strong>&gt;&gt; Case study:</strong> <a href="https://medium.com/@francis.john/web-font-optimization-at-nerdwallet-6a447be9b570">How NerdWallet used H1 Render Time to help improve font loading by up to 30%</a></p> <p><a href="/demo/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906&amp;share=39tfnozeq94p1o0hndk1kpbg4vb7cg" target="_blank" rel="noopener"><img style="width: 100%; max-width: 1200px;" src="https://img.speedcurve.com/blog/hero-h1.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/hero-h1.png?w=250&amp;auto=format,compress 200w, https://img.speedcurve.com/blog/hero-h1.png?w=533&amp;auto=format,compress 533w, https://img.speedcurve.com/blog/hero-h1.png?w=772&amp;auto=format,compress 772w, https://img.speedcurve.com/blog/hero-h1.png?w=959&amp;auto=format,compress 959w, https://img.speedcurve.com/blog/hero-h1.png?w=1169&amp;auto=format,compress 1169w, https://img.speedcurve.com/blog/hero-h1.png?w=1328&amp;auto=format,compress 1328w, https://img.speedcurve.com/blog/hero-h1.png?w=1464&amp;auto=format,compress 1464w, https://img.speedcurve.com/blog/hero-h1.png?w=1639&amp;auto=format,compress 1639w, https://img.speedcurve.com/blog/hero-h1.png?w=1788&amp;auto=format,compress 1788w, https://img.speedcurve.com/blog/hero-h1.png?w=1926&amp;auto=format,compress 1926w, https://img.speedcurve.com/blog/hero-h1.png?w=2069&amp;auto=format,compress 2069w, https://img.speedcurve.com/blog/hero-h1.png?w=2199&amp;auto=format,compress 2199w, https://img.speedcurve.com/blog/hero-h1.png?w=2400&amp;auto=format,compress 2400w" alt="H1 Rendering Time" /></a></p> <h3><strong>Largest Background Image Render</strong></h3> <p>For some pages, the background image is just as &ndash; or more &ndash; important than the largest image. We created this metric&nbsp;to ensure that you're not missing out.&nbsp;</p> <p><a href="/speedcurve-enterprise/top-sites/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=20751&amp;u=41458&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3" target="_blank" rel="noopener"><img style="width: 100%; max-width: 1200px;" src="https://img.speedcurve.com/blog/hero-background.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/hero-background.png?w=250&amp;auto=format,compress 200w, https://img.speedcurve.com/blog/hero-background.png?w=533&amp;auto=format,compress 533w, https://img.speedcurve.com/blog/hero-background.png?w=772&amp;auto=format,compress 772w, https://img.speedcurve.com/blog/hero-background.png?w=959&amp;auto=format,compress 959w, https://img.speedcurve.com/blog/hero-background.png?w=1169&amp;auto=format,compress 1169w, https://img.speedcurve.com/blog/hero-background.png?w=1328&amp;auto=format,compress 1328w, https://img.speedcurve.com/blog/hero-background.png?w=1464&amp;auto=format,compress 1464w, https://img.speedcurve.com/blog/hero-background.png?w=1639&amp;auto=format,compress 1639w, https://img.speedcurve.com/blog/hero-background.png?w=1788&amp;auto=format,compress 1788w, https://img.speedcurve.com/blog/hero-background.png?w=1926&amp;auto=format,compress 1926w, https://img.speedcurve.com/blog/hero-background.png?w=2069&amp;auto=format,compress 2069w, https://img.speedcurve.com/blog/hero-background.png?w=2199&amp;auto=format,compress 2199w, https://img.speedcurve.com/blog/hero-background.png?w=2400&amp;auto=format,compress 2400w" alt="Largest Background Image Rendering Time" /></a></p> <p>These core hero metrics&nbsp;are a great start, and they're now available by default in SpeedCurve.&nbsp;We've also created one more Hero Rendering Time that requires a bit more work on your end, but which will allow you to fine-tune your monitoring...</p> <h3><strong>Hero Element Timing</strong></h3> <p>Default metrics are important to have &ndash; not least because they're based on universal page elements, which means&nbsp;you can use them to <a href="http://support.speedcurve.com/videos/benchmark-yourself-against-your-competitors">compare your site to your competitors</a>. But chances are you want to get a more nuanced look at hero elements that are unique to your site, your pages, and your users. This is where Hero Element Timing comes in.&nbsp;</p> <p>Hero Element Timing &ndash; which is based on the&nbsp;<a href="https://docs.google.com/document/d/1yRYfYR1DnHtgwC4HRR04ipVVhT1h5gkI6yPmKCgJkyQ/edit?usp=sharing">Hero Element Timing API&nbsp;</a>&ndash; lets you select and annotate specific hero elements on your pages, such as search boxes, image carousels, and blocks of text.</p> <p>Right now, if you're a SpeedCurve user, you can&nbsp;<a href="https://docs.google.com/document/d/1yRYfYR1DnHtgwC4HRR04ipVVhT1h5gkI6yPmKCgJkyQ/edit#bookmark=id.dys97s4j97p">follow the instructions in the API spec to annotate your pages</a>, and see the results in your SpeedCurve results. (As a bonus, when browsers inevitably catch up and adopt the spec, you'll be ahead of the game.)</p> <p><a href="/speedcurve-enterprise/top-sites/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=40207&amp;u=75705&amp;share=0cv2ymz1ymyhv8b0hwbuvsz1a480u3" target="_blank" rel="noopener"><img style="width: 100%; max-width: 1200px;" src="https://img.speedcurve.com/blog/hero-element.png?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/hero-element.png?w=250&amp;auto=format,compress 200w, https://img.speedcurve.com/blog/hero-element.png?w=533&amp;auto=format,compress 533w, https://img.speedcurve.com/blog/hero-element.png?w=772&amp;auto=format,compress 772w, https://img.speedcurve.com/blog/hero-element.png?w=959&amp;auto=format,compress 959w, https://img.speedcurve.com/blog/hero-element.png?w=1169&amp;auto=format,compress 1169w, https://img.speedcurve.com/blog/hero-element.png?w=1328&amp;auto=format,compress 1328w, https://img.speedcurve.com/blog/hero-element.png?w=1464&amp;auto=format,compress 1464w, https://img.speedcurve.com/blog/hero-element.png?w=1639&amp;auto=format,compress 1639w, https://img.speedcurve.com/blog/hero-element.png?w=1788&amp;auto=format,compress 1788w, https://img.speedcurve.com/blog/hero-element.png?w=1926&amp;auto=format,compress 1926w, https://img.speedcurve.com/blog/hero-element.png?w=2069&amp;auto=format,compress 2069w, https://img.speedcurve.com/blog/hero-element.png?w=2199&amp;auto=format,compress 2199w, https://img.speedcurve.com/blog/hero-element.png?w=2400&amp;auto=format,compress 2400w" alt="Hero Element Rendering Time" /></a></p> <h2>Get started</h2> <p>That's it! Login to your SpeedCurve account to check out your core Hero Rendering Times and start exploring Hero Element Timing. If you're not already using SpeedCurve, <a href="/plan/trial/"><strong>sign up for a free trial</strong></a>.</p> <p>If you have any questions or feedback about Hero Rendering Times, we'd love to hear them.</p> Tue, 22 Aug 2017 00:00:00 +1200 The average web page is 3MB. How much should we care? https://speedcurve.com/blog/web-performance-page-bloat <p>A couple of month ago, someone asked if I'd written a page bloat update recently. The answer was no. I've written a lot of&nbsp;posts about page bloat, starting&nbsp;way back in 2012, when the average page hit 1MB. To my mind, the topic had been well covered. We know that the general trend is that pages are getting bigger at a fairly consistent rate of growth. It didn't feel like there was much new territory to cover.</p> <p>Also: it felt like Ilya Grigorik dropped the mic on the page bloat conversation with&nbsp;<a href="https://www.igvita.com/2016/01/12/the-average-page-is-a-myth/">this awesome post</a>, where he illustrated why&nbsp;the "average page" is a myth. Among the many things Ilya observed after&nbsp;analyzing <a href="http://httparchive.org/" target="_blank" rel="noopener">HTTP Archive</a> data for desktop sites, when you have outliers that weigh in at 30MB+ and&nbsp;more than 90% of your pages are under 5MB, an "average page size" of 2227KB (back in 2016) doesn't mean much.</p> <p>The mic dropped. We all stared at it on the floor for a while, then wandered away. And now I want to propose we wander back. Why? Because the average page is now 3MB in size, and this seems like a good time to pause, check our assumptions, and ask ourselves:</p> <p><strong>Is there any reason to care about page size as a performance metric? And if we don't consider page size a meaningful metric, then what should we care about?</strong></p> <p><strong><img style="max-width: 900px;" src="https://assets.speedcurve.com/img/blog/page-bloat-1-2011-vs-2017.png" alt="Web performance: page bloat" width="100%" /></strong></p><h2>Before we wade into this topic (again), some big important caveats</h2> <ul> <li><strong>The averages we're about to look at, which are taken from the HTTP Archive, are just that &ndash; averages of large datasets.</strong> They don't represent the "typical" website, because there's no such thing as a typical website.</li> <li><strong>These numbers are mainly relevant when viewed in a historical context.</strong> They represent trends &ndash; that's all.</li> <li><strong>These numbers should not <em>in any way</em> even remotely be taken as a benchmark for your own site.</strong> You haven't necessarily achieved anything great if your pages are smaller than this, nor have you failed if your pages are bigger.</li> <li><strong>Not all pages are getting bigger.</strong> Many have gotten smaller over the years. Maybe yours is one of them!</li> </ul> <h2>Graphs or it didn't happen, right?</h2> <p>Here you can see page growth from 2011 to now, broken out by content type:</p> <p><strong><img style="max-width: 900px;" src="https://assets.speedcurve.com/img/blog/page-bloat-2-2011-to-2017.png" alt="Web performance: page bloat" width="100%" /></strong></p> <p>The first thing that jumps out is the <strong>large amount of page real estate being taken up by video</strong>. Not a huge surprise, given the popularity of hero videos and such, but still interesting to note that this seems to account for much of the recent growth.</p> <p><strong>Custom font use continues to increase</strong>: 69% of the top 500,000 websites use them. Interesting to note the dip that took place, in terms of total KB, in 2016.</p> <p><strong><img style="max-width: 900px;" src="https://assets.speedcurve.com/img/blog/page-bloat-4-fonts.png" alt="Web performance: page bloat" width="100%" /></strong></p> <p>It's interesting to graph some of the current HTTP Archive data (below) and see which metrics remain flat relative to page size and which ones don't.</p> <p><strong><img style="max-width: 900px;" src="https://assets.speedcurve.com/img/blog/page-bloat-si-sr-ol.png" alt="Web performance: page bloat" width="100%" /></strong></p> <p>You can see above that <strong>start render is fairly consistent regardless of page size</strong>. This is quite interesting, because it suggests that bigger pages don't necessarily correlate to when users start being able to see content.</p> <p>Also, you can also see how easy it is to be <a href="https://www.stevesouders.com/blog/2013/05/13/moving-beyond-window-onload/" target="_blank" rel="noopener">misled by onload</a> as a performance metric, because it correlates so strongly with page size. In this graph, the steep rise of onload slightly hides the fact that Speed Index trends upward quite significantly &ndash; from 2393 (~2.4 seconds) for pages in the 500KB cohort to 10266 (~10.3 seconds) for pages in the 20MB cohort. This serves as a good reminder that <strong>Speed Index is generally a solid synthetic metric for user experience</strong>.</p> <h2>Prediction: 4MB pages by 2019?</h2> <p>I'm putting this out there as an interesting talking point, not as a cause for panic. Assuming a roughly 16% year-over-year increase in page size, the average page could exceed 4MB in just over two years.</p> <p><strong><img style="max-width: 900px;" src="https://assets.speedcurve.com/img/blog/page-bloat-5-prediction-2019.png" alt="Web performance: page bloat" width="100%" /></strong></p> <p>But again, going back to Ilya's point, this is just an average. 4MB pages are already here. According to the HTTP Archive, <strong>almost 16% of pages today &ndash; in other words, about 1 out of 6 pages &ndash; are 4 MB or greater in size</strong>. I routinely see pages (and I'm sure you do, too) that are 10MB or larger. When I was talking about this issue with <a href="https://twitter.com/MarkZeman">Mark</a> and <a href="https://twitter.com/Souders">Steve</a>, Mark referred to the fact that <a href="http://support.speedcurve.com/videos/conference-presentations/delivering-fast-and-rich-web-user-experiences">he's built pages that were 30MB that were still highly performant</a>.</p> <h2>If you care about user experience, page size isn't the right metric to track</h2> <p><a href="https://www.stevesouders.com/blog/2013/05/13/moving-beyond-window-onload/">Metrics like page size and load time typically are not good indicators of user-perceived performance.</a></p> <p>Take Amazon, for example. It's widely considered to be a performance leader, yet it has relatively heavy pages (I'm defining "heavy" as 3MB or more) and slow load times (I'm defining "slow" as 5 seconds or more). But for Amazon, page size and load time are the wrong metrics to look at.</p> <p>For example, looking at this recent test result page for the Amazon home page (which weighs in at just over 5MB), you can see a start render time of 1.4 seconds and a well-populated viewport at 2.5 seconds &ndash; despite the fact that the page doesn't fully load till 18.8 seconds.</p> <p><strong><img style="max-width: 900px;" src="https://assets.speedcurve.com/img/blog/page-bloat-amazon2.png" alt="Web performance: page bloat" width="100%" /></strong></p> <p>(If you're not already a SpeedCurve user and you want to noodle around with the SpeedCurve synthetic monitoring dashboard, <a href="/demo/site/?b=chrome&amp;d=30&amp;de=1&amp;ds=1&amp;r=us-west-1&amp;s=299&amp;u=906">check out our demo account</a>, which lets you explore data for a handful of media sites, including The Guardian, Huffington Post, and The New York Times. <strong>Even better, <a href="/plan/trial/" target="_blank" rel="noopener">sign up for a free trial</a> and take SpeedCurve out for a spin.</strong>)</p> <h2>Takeaways</h2> <h3>1. Page size matters, but perhaps not in the way you think</h3> <p>You can have large, robust pages that still feel fast. But you should care about page bloat in terms of how it affects mobile users, especially mobile-only users who are dealing with bandwidth constraints or data limits. At <a href="https://conferences.oreilly.com/fluent/fl-ca">Fluent</a> this past June, Tim Kadlec delivered a passionate <a href="https://www.youtube.com/watch?v=61MuwOtZBOE" target="_blank" rel="noopener">keynote</a> that addressed this issue. You should also check out Tim's nifty <a href="https://whatdoesmysitecost.com/" target="_blank" rel="noopener">online calculator</a>, which calculates the cost, in dollars, of your pages in countries around the world. It's an eye-opener.</p> <p><strong>What you can do:</strong> If you're not actively using performance budgets to set thresholds for metrics like page size, start render, and Speed Index, you should start.&nbsp;<a href="http://support.speedcurve.com/videos/performance-budgets-custom-metrics" target="_blank" rel="noopener">I love this short explainer video that explains how performance budgets work</a>.</p> <h3>2. Worry about images, but not too much</h3> <p>Yes, images make up the bulk of the average page, and you should definitely make sure you're not serving huge unoptimized images to your users. But this is one of those low-hanging fruit that's relatively easily addressable.</p> <p><strong>What you can do:</strong> <a href="/blog/find-and-fix-what-matters-most/">Find and fix problem images on your pages</a>.</p> <h3>3. Worry more about CSS and JavaScript</h3> <p>If you're serving asynchronous versions of your stylesheets and scripts, you need to know that these have the potential to block your pages altogether, because they're major CPU hogs.</p> <p><strong>What you can do: </strong>Asynchronous scripts are better than synchronous, <a href="https://calendar.perfplanet.com/2016/prefer-defer-over-async/" target="_blank" rel="noopener">but there's an argument for deferring scripts (if you can wrangle it)</a>. And if you're not already measuring CPU usage,&nbsp;<a href="/blog/track-down-front-end-cpu-hogs/">you should consider starting now.</a></p> <h3>4. If you care about measuring user experience, then use custom metrics</h3> <p>Correlating page size with user experience is like presenting someone with an entire buffet dinner and assuming that it represents what they actually ate. To properly measure user experience, we need to focus on the content &ndash; such as the navbar or hero product image &ndash; that users actually want to consume. The best performance metric for measuring user experience is one that measures how long the user waits before seeing this critical content.</p> <p><strong>What you can do:</strong> This is where custom timers, via the <a href="https://www.w3.org/TR/user-timing/">W3C User Timing spec</a>, come in. To implement custom timers, you need to identify the critical content on your pages, then add marks and measures to track when they render. Steve wrote <a href="/blog/user-timing-and-custom-metrics/">a great blog post</a> that goes into custom timers in more detail, as well as providing a handful of sample metrics to get you started. If you care about measuring UX, I strongly recommend checking it out.</p> <h2>To sum up...</h2> <p>At SpeedCurve, we don't think you need more performance data. <strong>We think you need the right performance data.</strong> That's why we're always working to develop metrics that give you meaningful insight into how your users experience your site. And it's why we believe setting performance budgets and alerts for those metrics is crucial. (If you're not already using SpeedCurve to monitor your site's performance, <a href="/plan/trial/"><strong>set up your free trial here</strong></a>.)</p> <p>The key to a good user experience is quickly delivering the critical content. This is easy to say, but historically has been tricky to do. Custom metrics are a huge evolutionary step forward. If you're using custom metrics, I'd love to hear how they're working for you and what you're learning from them. And if you're not using custom metrics, I'm curious to learn what the barriers are for you.</p> Wed, 09 Aug 2017 00:00:00 +1200 Find and fix what matters most https://speedcurve.com/blog/find-and-fix-what-matters-most <p>Being able to monitor and measure the performance of your pages is crucial. You know that already. You also know that the next step is to quickly find out what&rsquo;s hurting your pages so you can stop the pain.</p> <p>You want to know:</p> <ul> <li>Which performance rules is my page breaking?</li> <li>How do I prioritize my optimization efforts?</li> <li>How can I communicate this quickly and clearly to my team?</li> </ul> <p>We&rsquo;re super excited to announce that you can now use <a href="https://speedcurve.com/features/synthetic/">SpeedCurve</a> to answer these questions.</p> <p><img src="https://img.speedcurve.com/blog/perf-recommendations.png?w=919&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/perf-recommendations.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/perf-recommendations.png?w=526&amp;auto=format,compress 526w, https://img.speedcurve.com/blog/perf-recommendations.png?w=742&amp;auto=format,compress 742w, https://img.speedcurve.com/blog/perf-recommendations.png?w=919&amp;auto=format,compress 919w, https://img.speedcurve.com/blog/perf-recommendations.png?w=1854&amp;auto=format,compress 1854w" alt="Performance Recommendations" width="100%" /></p><p>Inspired by the great work done by Google&rsquo;s PageSpeed Insights team, we developed our own curated list of performance rules. We took the rules that are most relevant to developers in the real world, then augmented them with data that&rsquo;s unique to SpeedCurve &ndash; such as <a href="https://speedcurve.com/blog/measuring-blocking-resources/">critical blocking JavaScript and CSS.</a>&nbsp;And we packaged it with an intuitive UI that makes it easier for you to share your test results with your team, as well as other non-technical teams throughout your organization.</p> <h2>Get started</h2> <p>To get to your page-level diagnostics, go to your test timeline and open up any test results page. Scroll down, and voila. At a glance, you can see our curated list of performance rules, stacked and color-coded in their order of importance for this particular page. (We define &ldquo;importance&rdquo; as &ldquo;the total amount of positive impact that optimizing for this rule would have on performance&rdquo;.)</p> <p><img src="https://img.speedcurve.com/blog/perf-recommendations-blocking.png?w=919&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/perf-recommendations-blocking.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/perf-recommendations-blocking.png?w=526&amp;auto=format,compress 526w, https://img.speedcurve.com/blog/perf-recommendations-blocking.png?w=742&amp;auto=format,compress 742w, https://img.speedcurve.com/blog/perf-recommendations-blocking.png?w=919&amp;auto=format,compress 919w, https://img.speedcurve.com/blog/perf-recommendations-blocking.png?w=1852&amp;auto=format,compress 1852w" alt="Performance Recommendations Blocking" width="100%" /></p> <p>You can then expand any of these rules and see a list of specific assets that are causing trouble &ndash; again, listed in order of importance.</p> <p>And here&rsquo;s a feature I really love: When you look at your list of images that need optimization, you actually see thumbnails of each one, as well as a calculation of how much further each image can be optimized. This is a fantastic, fast, effective way to communicate to other teams in your organization, such as marketing and sales.</p> <p><img src="https://img.speedcurve.com/blog/perf-recommendations-images.png?w=919&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/perf-recommendations-images.png?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/perf-recommendations-images.png?w=526&amp;auto=format,compress 526w, https://img.speedcurve.com/blog/perf-recommendations-images.png?w=742&amp;auto=format,compress 742w, https://img.speedcurve.com/blog/perf-recommendations-images.png?w=919&amp;auto=format,compress 919w, https://img.speedcurve.com/blog/perf-recommendations-images.png?w=1852&amp;auto=format,compress 1743w" alt="Performance Recommendations Images" width="100%" /></p> <p>At SpeedCurve, we know you don&rsquo;t have infinite amounts of developer hours to optimize your pages. We want to help you focus on what matters. This new feature is just the beginning.</p> Thu, 22 Jun 2017 00:00:00 +1200 I've joined SpeedCurve! Here's why https://speedcurve.com/blog/tammy-everts-has-joined-speedcurve <h2 style="padding-top: 0px;">TL;DR</h2> <p>If Mark and Steve invited you to work with them, what would you say? Exactly.</p> <h2>Long version</h2> <p>Okay, I have to elaborate a bit more about why I&rsquo;m ridiculously excited about working with Mark and Steve. My first foray into the performance space was at the Velocity Conference in 2009. If you had told me then that someday I&rsquo;d be working with that tall guy rocking the main stage, I would&rsquo;ve thanked you for the kind words&hellip; while secretly thinking you were nuts. But here I am!</p> <p style="margin-bottom: 0px;"><img src="https://img.speedcurve.com/blog/tammy-conf.jpg?w=1200&amp;auto=format,compress" sizes="(max-width: 768px) 100vw, 60vw" srcset=" https://img.speedcurve.com/blog/tammy-conf.jpg?w=250&amp;auto=format,compress 250w, https://img.speedcurve.com/blog/tammy-conf.jpg?w=682&amp;auto=format,compress 682w, https://img.speedcurve.com/blog/tammy-conf.jpg?w=972&amp;auto=format,compress 972w, https://img.speedcurve.com/blog/tammy-conf.jpg?w=1188&amp;auto=format,compress 1188w, https://img.speedcurve.com/blog/tammy-conf.jpg?w=1200&amp;auto=format,compress 1200w" alt="Tammy at International Women's Day Tech Talks in Toronto" width="100%" /></p> <p style="font-size: 12px; text-align: center;">Tammy at <a href="http://iwd.devto.ca/">International Women's Day Tech Talks</a> in Toronto</p><p>And the first time I saw Mark's <a href="https://chrome.google.com/webstore/detail/perfmap/hgpnhiajcdppfbogcpfdgcceepgkhdmk" target="_blank" rel="noopener noreferrer">awesome Perfmap plugin</a>, I knew that it was created by someone who thinks about performance and usability the same way I do... and someone I needed to get to know.</p> <p>Saying yes to working with Mark and Steve was a no-brainer, of course. Here's why I'm excited not just about working with these guys, but also about working at SpeedCurve.</p> <p>I spent the past two decades studying how people use the web. As already mentioned, for the past eight years I focused on how web performance intersects with user experience and business metrics. I&rsquo;ve done everything from studying massive data sets of billions of user experiences to far-out neuroscientific lab studies involving EEG headsets. I even wrote <a href="http://shop.oreilly.com/product/0636920041450.do" target="_blank" rel="noopener noreferrer">a book</a> about it.</p> <p>I tend to think of my work as answering three different questions:</p> <ul> <li>How do people use the web?</li> <li>How do site owners want to understand how people use the web?</li> <li>How can we build better and better tools that let site owners understand their visitors in ways that are most meaningful to them and their business?</li> </ul> <p>As Chief Experience Officer at SpeedCurve, I get to answer all three of those questions in new and exciting ways. I&rsquo;ll be marrying two aspects of experience that go together like PB&amp;J:</p> <p><strong>User experience, as measured and monitored by our synthetic and <a href="https://speedcurve.com/features/lux/">RUM</a> tools.</strong> I&rsquo;ve said this countless times: <em>Every company is different. Every site is different. Every visitor is different. Every visit is different.</em> I never stop being curious about these differences, and there are always new metrics to create and new things to learn. I love SpeedCurve&rsquo;s tools and I&rsquo;m thrilled to have the opportunity to use them every day.</p> <p><strong>Customer experience, in terms of how our customers use our tools.</strong> I&rsquo;ll be working closely with our customers to understand the specific ways they use SpeedCurve to understand their visitors. I&rsquo;ll use that understanding to help make our tools &ndash; and our own customers&rsquo; experience &ndash; even better. Full disclosure: While I&rsquo;ve been involved in a lot of conversations with customers in the past, it&rsquo;s never been part of my official job description. I&rsquo;m super excited about this aspect of my new role!</p> <p>The best tools are driven by listening to what people want. I&rsquo;m a good listener. <a href="mailto:support@speedcurve.com">Hit me up.</a></p> Mon, 15 May 2017 00:00:00 +1200 A/B Testing JSONP and the Preloader with RUM https://speedcurve.com/blog/ab-testing-jsonp-and-the-preloader-with-rum <p>SpeedCurve is a SPA (Single Page App) so we construct the charts dynamically using <a href="https://en.wikipedia.org/wiki/JSONP">JSONP</a>. It works great, but we're always looking for ways to make the dashboards faster. One downside to&nbsp;making requests dynamically is that the browser <a href="https://www.smashingmagazine.com/2016/02/preload-what-is-it-good-for/">preloader</a> isn't used. This isn't a factor for later&nbsp;SPA requests, but on the first page view the preloader might still bring some benefits. Or maybe not. We weren't sure, so we ran an A/B test. Long story short, doing the first JSONP request via markup caused charts to render 300 milliseconds faster.&nbsp;</p> <p><img style="width: 100%;" src="https://speedcurve.com/img/blog/jsonpmarkup.png" alt="A/B Test Results" /></p><p>It's easy to run&nbsp;this A/B test using our RUM product,&nbsp;<a href="https://speedcurve.com/features/lux/">LUX</a>. The first step is&nbsp;to add a&nbsp;<a href="https://www.w3.org/TR/user-timing/">User Timing</a>&nbsp;metric that marks when the JSONP response is received. We call this metric OnDataReceived.&nbsp;<a href="http://caniuse.com/#feat=user-timing">Some popular browsers don't support User Timing</a>, so we use LUX's shim for mark() and measure() since it works in all browsers:</p> <pre> function OnDataReceived(jsondata) { LUX.measure("OnDataReceived"); ...</pre> <p>The code above measures the time from <a href="https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart">NavigationStart</a> to when the JSONP response is processed. All User Timing marks and measures are automatically captured by LUX and displayed in customers' dashboards.</p> <p>The next step is to split users across two buckets. In the control bucket we continue to fetch the JSONP dynamically. In the test bucket we use&nbsp;markup to make the JSONP request. We use LUX's <a href="http://support.speedcurve.com/apis/lux-api#luxadddataname-value">addData API</a>&nbsp;to segment&nbsp;the RUM data across these buckets. The control bucket has JsonpMarkup=no, while the test bucket has JsonpMarkup=yes. Here's the backend PHP snippet:</p> <pre> if ( rand(0,1) ) { echo "&lt;script&gt;onGo();&lt;/script&gt;\n"; // request JSONP dynamically echo "&lt;script&gt;LUX.addData('JsonpMarkup', 'no');&lt;/script&gt;\n"; } else { echo "&lt;script src='/site-data?jsonp=OnDataReceived'&gt;&lt;/script&gt;\n"; echo "&lt;script&gt;LUX.addData('JsonpMarkup', 'yes');&lt;/script&gt;\n"; } </pre> <p>Within a few minutes the data shows that OnDataReceived is ~300 milliseconds faster for the JsonpMarkup=yes bucket. We let the A/B test run a few days to confirm that using markup for the initial JSONP request is faster thanks to the browser preloader.</p> <p>If you make requests dynamically using JavaScript, you might be missing a performance opportunity by letting the preloader do its work. This isn't just true for JSONP requests, it also applies to images. If you're curious about this optimization, run an A/B test to&nbsp;see if making initial requests using markup makes your site faster and your users happier. We'd be happy to set you up with a <a href="https://speedcurve.com/features/lux/#snippet">LUX free trial</a>&nbsp;to make it easy&nbsp;peasy (lemon squeezy).</p> Tue, 02 May 2017 00:00:00 +1200 Improved Favorites https://speedcurve.com/blog/improved-favorites <p>We've improved the&nbsp;"Favorites" dashboard which now lets you build your own charts which:</p> <ul style="margin-bottom: 25px;"> <li style="margin-bottom: 5px;">Combine synthetic tests and <a href="https://speedcurve.com/features/lux/">LUX (real user monitoring)</a> in one chart.</li> <li style="margin-bottom: 5px;">Choose average, median, or 95th percentile.</li> <li style="margin-bottom: 5px;">Create charts that have multiple metrics.</li> <li style="margin-bottom: 5px;">Select multiple values for a filter, eg, browser = Chrome or Firefox, country = UK or US.</li> <li style="margin-bottom: 5px;">Compare A/B tests in a single chart.</li> </ul> <p>Here's a walkthrough showing you some of the new features:</p> <script charset="ISO-8859-1" src="https://fast.wistia.com/assets/external/E-v1.js"></script> <div class="wistia_embed wistia_async_zemnmyfu9k videoFoam=true" style="width: 540px; height: 304px; margin-bottom: 25px;">&nbsp;</div><p>We've also improved the performance and user experience of the Favorites charts. There are a lot more filter options and each chart loads individually getting charts to you faster.</p> <p>We'd love your feedback. Let us know what else you'd like to see added to the Favorites dashboard. Here's a few of the things we're considering&nbsp;adding like filmstrips and histograms.</p> Tue, 18 Apr 2017 00:00:00 +1200 Measuring Blocking Resources https://speedcurve.com/blog/measuring-blocking-resources <p>SpeedCurve reports the number of critical blocking resources in the page. These are the resources that block rendering. Since it's important that users see your content as quickly as possible, it's important to know what might be causing your page to render slowly. We recently enhanced the way we measure blocking resources and wanted to share those improvements with our customers as well as the performance community at large.&nbsp;</p> <p>The main culprits that block rendering are scripts and stylesheets that are loaded synchronously. A great way to avoid this blocking problem is to load your scripts and stylesheets asynchronously. You can do that for scripts by using the <a href="https://www.w3.org/TR/html5/scripting-1.html#attr-script-async">async</a> and <a href="https://www.w3.org/TR/html5/scripting-1.html#attr-script-defer">defer</a> attributes, plus other <a href="https://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/">programmatic techniques</a>. Loading stylesheets asynchronously is less popular but is still possible using techniques like <a href="https://github.com/filamentgroup/loadCSS">loadCSS</a>.&nbsp;</p><p>We recently improved how blocking stylesheets are measured. The first change is&nbsp;to ignore stylesheets loaded via loadCSS; these are asynchronous and thus don't block rendering. Similarly, we ignore stylesheets that are initially loaded with <a href="https://www.smashingmagazine.com/2016/02/preload-what-is-it-good-for/#markup-based-async-loader">link-rel-preload</a>&nbsp;and later added to the DOM dynamically.&nbsp;Finally, we ignore stylesheets with a "print" media type. If your site uses any of these techniques, then your "Blocking CSS" SpeedCurve metric&nbsp;will decrease.</p> <p>We also improved how blocking scripts are measured. But before diving into that, I need to explain a subtle difference in how scripts and stylesheets block rendering. Synchronous stylesheets block the entire DOM from rendering. Synchronous scripts, however, only block the elements that follow the SCRIPT tag in the DOM tree. This is illustrated in the figure below where scripts that block rendering are shown in red. Async and defer scripts are always green (non-blocking) no matter where they occur in the DOM. Synchronous scripts, however, block rendering if they occur in the HEAD or in the BODY above any DOM elements that are in the viewport. If synchronous scripts&nbsp;occur below the visible DOM, then they don't block rendering.&nbsp;</p> <p style="text-align: center;"><img style="width: 100%; min-width: 250px; max-width: 549px;" src="https://assets.speedcurve.com/img/blog/blocking.png" alt="Blocking Scripts" /></p> <p>This leads to an important optimization in how to measure blocking JS. If a page has a synchronous script at the bottom of the page (below all the visible DOM elements), then it does <em>not</em> block rendering (because all the visible DOM elements precede the SCRIPT tag).</p> <p>In order to accurately measure blocking scripts, SpeedCurve does more than just track whether scripts are sync or async. We also determine if the script blocks rendering. We do this by determining if the synchronous script occurs before any of the DOM elements in the viewport. If a script is loaded synchronously and occurs before any DOM elements in the viewport, then we count it as "blocking JS". If it occurs after all the viewport's DOM elements, then it is not counted as blocking (even if it's loaded synchronously).</p> <p>This change may&nbsp;decrease your "Blocking JS" SpeedCurve metric if you have synchronous scripts in the body of the page. It did for us! In the SpeedCurve.com dashboards, all the charts are loaded via synchronous scripts, but all those synchronous scripts are below the visible DOM. So our Blocking JS metric dropped from 4 to 0! This helps us focus on the resources that are most important for improving rendering.</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://assets.speedcurve.com/img/blog/blocking-js.png" alt="Blocking JS Chart" width="572" height="375" /></p> <p>Measuring blocking resources&nbsp;is difficult to do, but it's one of the most important metrics to track if you want to optimize your Start Render time. We're glad we have both of these metrics. We're also glad this code is behind us. Phew!</p> Thu, 02 Feb 2017 00:00:00 +1300 SpeedCurve RUM: LUX https://speedcurve.com/blog/speedcurve-rum-lux <p>We're excited to announce SpeedCurve's RUM product, <a href="https://speedcurve.com/features/lux/">LUX</a>.</p> <p>The name LUX is a play on "<span style="text-decoration: underline;"><strong>L</strong></span>ive <span style="text-decoration: underline;"><strong>U</strong></span>ser e<span style="text-decoration: underline;"><strong>X</strong></span>perience" and reflects how we've taken a different approach compared to other Real User Monitoring products. SpeedCurve's mission is to help designers and developers create joyous, fast user experiences. To do that, we focus on metrics that do a better job of revealing what the user's experience is really like.&nbsp;</p> <p>In addition to standard RUM metrics like page load time and total size, LUX includes innovative new metrics that have more to do with the user experience like start render time, number of critical blocking resources, images above the fold, and viewport size.&nbsp;LUX's RUM metrics help you figure out which design and development improvements&nbsp;will make your users happier and&nbsp;your business more successful.</p><p>Now that SpeedCurve has both synthetic monitoring and RUM, we can mash those up to give better insights. For example, we compare your synthetic metrics to&nbsp;RUM so&nbsp;you understand how your synthetic performance will translate when&nbsp;staged code is pushed to production. Also, we give you feedback on which URLs, browsers, and geo locations are popular from RUM to help you improve your synthetic test settings to better approximate the real user experience.</p> <p>You can see SpeedCurve RUM&nbsp;in action by viewing the&nbsp;<a href="https://speedcurve.com/webpagetest/lux-users/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">LUX demo account</a>. The data comes from <a href="https://www.webpagetest.org/">webpagetest.org</a> where Pat Meenan agreed to inject the LUX snippet. There are four LUX dashboards: <a href="https://speedcurve.com/webpagetest/lux-live/?ld=1&amp;share=uga4v95goqtuwzip0h1yus236zp92f">Live</a>, <a href="https://speedcurve.com/webpagetest/lux-users/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">Users</a>, <a href="https://speedcurve.com/webpagetest/lux-perf/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">Performance</a>, and <a href="https://speedcurve.com/webpagetest/lux-design/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">Design</a>.</p> <p>The&nbsp;<a href="https://speedcurve.com/webpagetest/lux-live/?ld=1&amp;share=uga4v95goqtuwzip0h1yus236zp92f">LUX Live</a>&nbsp;dashboard constantly updates to show the users currently&nbsp;visiting your site.</p> <p><img style="width: 100%;" src="https://speedcurve.com/img/lux-live.png" alt="LUX Live" /></p> <p>You can hover over a row to highlight all visits for that user's session. Clicking on a row shows the details for that user's visit including Navigation Timing, User Timing, user interaction, and page design metrics.</p> <p><img style="width: 100%; border: 2px solid #000;" src="https://speedcurve.com/img/lux-page-details.png" alt="LUX Page Details" /></p> <p>The&nbsp;<a href="https://speedcurve.com/webpagetest/lux-users/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">LUX Users</a>&nbsp;dashboard shows information about your users including page views broken out by type of user interaction. It also shows the top pages,&nbsp;browsers, viewports, cities, and countries across all your users.</p> <p><img style="width: 100%;" src="https://speedcurve.com/img/lux-users-pvs.png" alt="Page Views" /></p> <p><a href="https://speedcurve.com/webpagetest/lux-perf/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">LUX Performance</a>&nbsp;shows the core performance metrics like backend vs frontend time (where everyone should start), User Timing custom metrics (if you have any), and time to first user interaction (often the best reflection of the user's experience). It also contains a great example of mashing up RUM and synthetic for start render and page load time.</p> <p><img style="width: 100%;" src="https://speedcurve.com/img/lux-perf-syn.png" alt="LUX and Synthetic" /></p> <p>The&nbsp;<a href="https://speedcurve.com/webpagetest/lux-design/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">LUX Design</a>&nbsp;dashboard has most of our innovative views of how performance and design impact the user experience. If your start render time is slow, it's good to see how many critical blocking stylesheets and scripts are being served to real users, especially if you have third party tags. Comparing the number of images above-the-fold with the total number of images indicates whether you should be lazy loading images outside of the initial viewport. Similarly, comparing viewport size to document size indicates if you have other content that you should lazy load. LUX also shows the most popular DOM elements that&nbsp;users interact with.</p> <p><img style="width: 100%;" src="https://speedcurve.com/img/lux-design-critical.png" alt="Critical Blocking Resources" /></p> <p>We also make it easy to slice-and-dice the data. Expanding the Dropdown reveals various dimensions that can be used to segment the data. You can choose from the top values that are shown, or enter a value. Wildcards are supported. You can also click on any of the lists of values in the dashboards to filter on that value.</p> <p style="text-align: center;"><img style="width: 100%; border: 2px solid #000; max-width: 689px;" src="https://speedcurve.com/img/lux-dropdown.png" alt="LUX Dropdown" /></p> <p>Take LUX for a test drive&nbsp;by going to&nbsp;the&nbsp;<a href="https://speedcurve.com/webpagetest/lux-users/?ld=1&amp;lde=1&amp;lds=1&amp;stat=median&amp;share=uga4v95goqtuwzip0h1yus236zp92f">LUX demo account</a>. More information, including an FAQ and API, can be found on the <a href="https://speedcurve.com/features/lux/">LUX features</a> page.&nbsp;</p> <p>If you'd like to signup for LUX, head over to our <a href="https://speedcurve.com/pricing/">pricing page</a> and fill out the signup form. We look forward to helping you create fast, joyous experiences for your users.&nbsp;</p> Tue, 01 Nov 2016 00:00:00 +1300 Build your own charts https://speedcurve.com/blog/build-your-own-charts <p>We put a lot of thought into curating a thematic set of dashboards that help you understand the performance of your front-end, but sometimes you just want to play with the data yourself and slice 'n' dice the data in all sorts of different ways. We've added a new "Favorites" dashboard that lets you do just that. You can explore the data and build your own charts, then rearrange them and share them with the team to help demonstrate the performance issues you're focused on right now.</p> <p>Here's a walkthrough showing you how to slice the available data in different ways:</p> <script charset="ISO-8859-1" src="https://fast.wistia.com/assets/external/E-v1.js"></script> <div class="wistia_embed wistia_async_breilivn0j videoFoam=true" style="width: 540px; height: 304px; margin-bottom: 25px;">&nbsp;</div><p>We'd love your feedback. Let us know what else you'd like to see added to the Favorites dashboard. Here's a few of things we're considering&nbsp;adding:</p> <ul> <li>Select multiple metrics on the same chart</li> <li>Choose median rather than average along with support for percentiles</li> <li>Custom metrics</li> <li>Click through to an individual test for each data point</li> <li>Filmstrips</li> <li>Histograms</li> </ul> Mon, 10 Oct 2016 00:00:00 +1300 Track down front-end CPU hogs https://speedcurve.com/blog/track-down-front-end-cpu-hogs <p>Often when monitoring and debugging site performance we focus on network activity and individual resources, but what about the CPU? As more and more sites switch to using large Javascript frameworks and manipulating the page using Javascript, the execution time this code takes and the available CPU can instead become the performance bottleneck.</p> <h2>CPU usage for all Chrome tests</h2> <p>For any of SpeedCurve's&nbsp;Chrome-based tests, including emulated devices, we capture the Chrome Dev Tools timeline. From the browser main thread usage in the timeline we extract how busy the CPU is and what it's spending time on. Is it busy executing Javascript functions or busy laying out elements and painting&nbsp;pixels?</p> <p>We also measure the CPU usage to different key events&nbsp;in the rendering of the page. SpeedCurve's focus is on the user experience and getting content in front of people as fast as possible, so we show you what the CPU is doing up till the&nbsp;page starts to render. This reflects CPU usage during the browser critical rendering path and can highlight various issues. If there's lots of CPU idle time then you're not delivering your resources efficiently. You want to get the CPU busy nice and early rendering the page, rather than sitting idle waiting for slow resources.</p> <p>In the test&nbsp;below we see in the first pie chart that the CPU is spending a lot of time on layout up to the start render event, which is quite a different picture from the Fully Loaded CPU usage. &nbsp;</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/cpu_pie.png" alt="CPU pie charts" /></p><h2>CPU trends and budgets</h2> <p>We've also added trending charts for the CPU time to both the Start Render and Fully Loaded browser events. This allows you to spot any significant changes over time and can highlight both CSS and Javascript changes&nbsp;which are causing CPU issues. In the example below we see a dramatic change in the Layout CPU time for this URL. The browser was being tied up by dodgy Javascript which was causing a huge amount of layout thrashing and reflows. Once fixed the Layout time drops dramatically.</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/cpu_start_render.png" alt="CPU to Start Render" /></p> <p>We also support performance budgets for all the CPU metrics allowing you to get email and Slack alerts whenever a threshold is crossed. It's going to be interesting to see what sort of budgets teams put on script execution and layout. Not only can you monitor the size and number of Javascript or CSS scripts but&nbsp;you can ensure it's well written code that's not thrashing the CPU.</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/cpu_layout_budget.png" alt="CPU layout budgets" /></p> <h2>Chrome Dev Tools timeline goodness</h2> <p>It's amazing how much performance data is packed into the Chrome Dev Tools timeline and for every single Chrome based test on SpeedCurve we capture the timeline. You can click through to an online timeline viewer at the bottom of the SpeedCurve waterfall chart.</p> <p>Here's the timeline for the URL above which had a layout thrashing issue, highlighted by the dark red bar between 2-4s. It's amazing to have this level of debugging for every test!</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/cpu_chrome_timeline.png" alt="Chrome Dev Tools Timeline" /></p> <h2>Test agent CPU</h2> <p>It's worth noting that the test agents we currently run at SpeedCurve are fairly low spec and so don't have oodles of available CPU. We do this to help emulate lower spec mobile devices. Over the last year we've seen CPU usage grow and some URLs with a lot of heavy Javascript and CSS are now maxing out the CPUs on our test agents. Although it's fascinating to see well constructed sites (I'm looking at you <a href="https://speedcurve.com/demo/site/?b=chrome&amp;d=30&amp;r=us-west-1&amp;s=302&amp;u=917&amp;share=39tfnozeq94p1o0hndk1kpbg4vb7cg" target="_blank">Smashing</a>) not have this issue at all, with plenty of CPU idle time available as the page renders.</p> <blockquote> <p>We all need to add CPU usage to our front-end performance toolkits!</p> </blockquote> <p>We're thinking about introducing new agents with higher CPU specs so that you can test on both a lower spec CPU that represents an emulated device and a high CPU agent that better represents a desktop browser. Sing out in the comments if this is something you're interested in or you've discovered something interesting in your CPU usage charts.</p> <p>If you're not already using SpeedCurve to monitor your site's performance and track your own CPU hogs,&nbsp;<a href="https://speedcurve.com/plan/trial/"><strong>set up your free trial here</strong></a>.</p> Thu, 22 Sep 2016 00:00:00 +1200 SpeedCurve Waterfall https://speedcurve.com/blog/speedcurve-waterfall <p>If you're a performance engineer, then you're familiar with waterfall charts. They are found in browser dev tools as well as other performance services. I use multiple waterfall tools&nbsp;every day, but the waterfall chart&nbsp;I love the most is the one we've built at SpeedCurve:</p> <p style="text-align: center;"><img style="width: 100%; min-width: 300px; max-width: 712px; border: 1px solid;" src="https://assets.speedcurve.com/img/blog/sc-waterfall-startrender.png" alt="SpeedCurve waterfall" /></p><p>We've added a number of great features to our waterfall chart. In&nbsp;the screenshot above we see the&nbsp;vertical lines we've added to show Backend, Start Render, and Onload. My favorite feature is the thumbnail "scrubber" at the bottom of the waterfall. As you move your mouse horizontally through the timeline, the scrubber shows the thumbnail that corresponds to that point in time. This makes it easier to correlate the rendering experience with what's happening in the network.</p> <p>For example, in the waterfall above we see that Start Render occurs at 5208 milliseconds. It's a good thing that we can see the thumbnail at that point in time because the only thing being&nbsp;rendered is a spinner! To find out when the actual page content is displayed, we move the mouse forward in time while watching the scrubber. Eventually we see that the actual content on the page appears at 9139 milliseconds, as shown below. By correlating this thumbnail with the network requests we can track down the cause for this four second delay, most likely the late arrival of a JSON payload containing the search results.</p> <p style="text-align: center;"><img style="width: 100%; min-width: 300px; max-width: 712px; border: 1px solid;" src="https://assets.speedcurve.com/img/blog/sc-waterfall-content2.png" alt="SpeedCurve content waterfall" /></p> <p>By default we color the network requests to reflect the Content-Type: scripts are orange, images are purple, etc. We also provide options that allow you to use colors that reflect&nbsp;the connection state: DNS lookup (aqua), TCP connection (orange), SSL negotiation (purple), Time-to-First-Byte (green), and content download (blue). You can also choose to have the height of each request reflect the content size. Both of these options are shown here:</p> <p style="text-align: center;"><img style="width: 100%; min-width: 300px; max-width: 712px; border: 1px solid;" src="https://assets.speedcurve.com/img/blog/sc-waterfall-connection.png" alt="SpeedCurve connection waterfall" /></p> <p>I've added a screencast below to give a taste of what these features are&nbsp;like. But the&nbsp;best way to experience these awesome features is to do&nbsp;a <a href="https://speedcurve.com/plan/trial/">free trial</a>. Signup today to scrub your thumbnails and&nbsp;give your users a&nbsp;fast, joyous experience.</p> <p><iframe src="https://www.youtube.com/embed/um0BavAbYNE" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> Tue, 20 Sep 2016 00:00:00 +1200 PWA Performance https://speedcurve.com/blog/pwa-performance <p>Progressive Web Apps (PWAs) combine the best and newest features of the Web to deliver an experience that rivals native applications on mobile. Even better, they work on desktop, too. In fact, they work everywhere that the Web works! "Ah", you say, "that's not true! They require features that don't exist in all browsers." Because PWAs are "progressive", they can adapt to older browsers to deliver the best experience possible given the features that are available.</p> <p>Given these winning attributes, it's no surprize that PWAs are the most popular movement in web development today. And while there are already numerous conferences, videos, and evangelists for PWAs, there's less focus on testing and tracking the performance of PWAs. Mark and I discussed this gap in PWA performance. In response, we added some new features to SpeedCurve that, coupled with some existing features, provide a great toolkit for evaluating the performance of PWAs.</p><h2>PWA Offline Script</h2> <p style="margin-bottom: 0; padding-bottom: 0;">To answer the question "What's the key to measuring PWA performance?" let's look at some of the <a href="https://developers.google.com/web/fundamentals/getting-started/your-first-progressive-web-app/">key features of PWAs</a> that have the biggest impact on performance:</p> <ul style="color: black;"> <li style="margin-bottom: 11px;"><b>responsive</b> - PWAs work across different devices and viewport sizes</li> <li style="margin-bottom: 11px;"><b>progressive</b> - they adapt to different browsers, regardless of missing features</li> <li style="margin-bottom: 11px;"><b>offline</b> - they work offline (after an initial <em>lightweight</em> installation)</li> </ul> <p style="margin-bottom: 0; padding-bottom: 0;">The trickiest part is testing the offline experience. SpeedCurve is built on top of <a href="https://www.webpagetest.org/">WebPageTest</a>, so we use its scripting language to load the PWA while online, and then load it again without any network access. Here's the script using&nbsp;<a href="https://www.pokedex.org/">Pokedex</a> as our example PWA:</p> <pre style="margin-left: 4em;">logData 0 navigate https://www.pokedex.org/ execAndWait document.body.innerHTML="" logData 1 blockDomainsExcept unused.zz navigate https://www.pokedex.org/ </pre> <p>For the initial load while we're online, we turn off data logging and navigate to the URL. For cleaner filmstrips we clear the body's content between loads. Then we turn logging on and navigate to the URL again, but this time we're offline. The offline experience is created by blocking all domains. This forces the browser to fallback to its offline capabilities.</p> <h2>Responsive, Progressive, &amp; Offline</h2> <p>Let's look at how SpeedCurve measures these key PWA features. Using the PWA offline script shown above, we can verify that Pokedex loads without a network. Looking at the <a href="https://speedcurve.com/speedcurve-enterprise/pwas/test/160910_2J_d966378ffdbf084c298f54d9fc2b0a0f/">Pokedex test results for Samsung Galaxy S III</a>, we notice something really peculiar. There's a filmstrip, but there's no waterfall chart! What also stands out is that the Start Render time is 0.1 seconds! Pokedex loads instantly because it falls back to its offline experience. This is a web developer's (and user's) dream come true: a fast experience even while offline.</p> <p>SpeedCurve's <a href="https://speedcurve.com/speedcurve-enterprise/pwas/responsive/?d=30&amp;m=speedindex&amp;r=us-west-1&amp;s=20351&amp;u=40456&amp;share=m8crfo97k8yns71io7syaon6mfuo22">Responsive dashboard for Pokedex</a> sheds light on both the PWA's responsive and progressive behavior. Even while offline, the app loads on all browsers except IE 11. The site also behaves in a responsive manner as well. Notice how the left nav only appears on larger viewports. (Note: Since SpeedCurve uses emulation for mobile devices, it's not worth testing iOS since it doesn't support offline.)&nbsp;</p> <div style="text-align: center; margin-bottom: 1em;"><img style="width: 60%; min-width: 320px; margin-bottom: 50px;" src="https://assets.speedcurve.com/img/blog/pwa-performance-responsive2.jpg" alt="PWA Performance" /></div> <h2>Script Templates</h2> <p>Mark added a cool new "script templates" feature in SpeedCurve to make it easier to create this PWA offline script, as well as other important scripts.</p> <div style="text-align: center; margin-bottom: 1em;"><img style="width: 75%; min-width: 320px;" src="https://assets.speedcurve.com/img/blog/pwa-script-templates.png" alt="PWA Script Template" /></div> <p style="margin-bottom: 0; padding-bottom: 0;">In addition to the PWA offline script, we have these other script templates:</p> <ul style="color: black;"> <li style="margin-bottom: 11px;"><b>Repeat View</b> - See what performance is like when the cache is full.</li> <li style="margin-bottom: 11px;"><b>Block Third Party</b> - This script blocks all third party requests. This is helpful for teams who want to focus on the parts of the page that they control and eliminate variability from external resources.</li> <li style="margin-bottom: 11px;"><b>Don't add "PTST" to user agent</b> - By default, WebPageTest includes the string "PTST" in the User-Agent request header, but that may cause some web services (especially ad networks) to send back a different response. Using this script ensures third parties are behaving the way they do in the real world, but it also removes the ability to filter out the testing in your own analytics.</li> </ul> <p>NOTE: You need a <a href="https://speedcurve.com/pricing/">SpeedCurve Enterprise Plan</a> to see the scripting UI. If you don't have an Enterprise Plan you can try the PWA offline script in <a href="https://www.webpagetest.org">WebPageTest</a>.</p> <h2>Happy PWA</h2> <p>Thanks to the PWA offline script, you can verify that your PWA loads without any network. SpeedCurve also helps you&nbsp;see that it's progressive across all browsers, and responsive across all viewport sizes. And don't forget about the initial load experience! That's easy to test with SpeedCurve (just enter the URL without any script). It's important to make sure that your PWA fully loads as quickly as possible so that it's ready to work if the user goes offline.</p> <p>Making sure your PWA is responsive, progressive, and works offline is key. SpeedCurve is&nbsp;a great way to keep track of how your PWA performs and&nbsp;to deliver a fast, enjoyable experience for your users across all devices.</p> Mon, 12 Sep 2016 00:00:00 +1200 Measuring the User Experience https://speedcurve.com/blog/measuring-the-user-experience <p>SpeedCurve&rsquo;s sweet spot is the intersection of design and performance - where the user experience lives. Other monitoring services focus on network behavior and the mechanics of the browser. Yet users rarely complain that &ldquo;the DNS lookups are too slow&rdquo; or &ldquo;the load event fired late&rdquo;. Instead, users get frustrated when they have to wait for the content they care about to appear on the screen.</p> <p><em>The key to a good user experience is quickly delivering the critical content.</em></p><p>SpeedCurve helps you do this by focusing on metrics that reflect what the user actually experiences. For web pages, this comes down to when the content gets rendered. In last month&rsquo;s redesign, we added a new rendering chart. Here&rsquo;s an example of <a href="https://speedcurve.com/demo/site/?s=302&amp;u=917&amp;b=chrome&amp;r=us-west-1&amp;d=30&amp;share=39tfnozeq94p1o0hndk1kpbg4vb7cg">Smashing&rsquo;s rendering chart</a>:</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/chart-rendering-chart.png" alt="Rendering Chart" /></p> <p>To emphasize the importance of rendering, we made this&nbsp;the first chart in the dashboard. The rendering chart includes metrics for Start Render, Speed Index, and Visually Complete. Start Render is the lower bound indicating render time for the first pixel. Visually complete bookends that with a metric for rendering the last pixel. Speed Index sits in-between showing the average render time across all pixels. (Many people were surprised to find out that Speed Index is &ldquo;<a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index">expressed in milliseconds</a>&rdquo;.)</p> <p>Rendering is important, but not all pixels have equal importance. Instead, most pages have critical design elements (e.g, the call-to-action or hero image). Knowing when this critical content is available is even more important than overall rendering metrics. Measuring critical content is done with <a href="https://speedcurve.com/blog/user-timing-and-custom-metrics/">Custom Metrics and the User Timing spec</a>. We jazzed up the Custom Metrics chart as part of the recent redesign:</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/chart-custom-metrics.png" alt="" /></p> <p>If rendering and critical content get slower, the first place to investigate&nbsp;is the number of <a href="https://speedcurve.com/blog/critical-blocking-resources/">critical blocking resources</a>. Since it&rsquo;s hard for developers to track changes in the number of blocking scripts and stylesheets across releases, we added that as a new metric in SpeedCurve. Here&rsquo;s the chart of <a href="https://speedcurve.com/demo/site/?s=300&amp;u=909&amp;b=chrome&amp;r=us-west-1&amp;d=30&amp;share=39tfnozeq94p1o0hndk1kpbg4vb7cg">critical blocking resources for NY Times</a>:</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/chart-critical-resources.png" alt="" /></p> <p>We&rsquo;re excited to find such fertile ground for accelerating how our customers deliver their critical content to users. If you&rsquo;d like to see these metrics for the user experience on your website, start a <a href="https://speedcurve.com/plan/trial/">free trial</a> today and give SpeedCurve a try.</p> Tue, 03 May 2016 00:00:00 +1200 More emulated devices and improved flexibility https://speedcurve.com/blog/more-emulated-devices-and-improved-flexibility <p>SpeedCurve users may have noticed some changes recently. At the beginning of March we released a major redesign of our Settings UI that gives users more flexibility to get the exact test results they want. The two biggest changes were to the way we emulate devices&nbsp;and to allow different testing&nbsp;configurations for different sites.</p><h2>Emulated Phones &amp; Tablets</h2> <p>Previously, emulated devices&nbsp;were hidden in the Responsive testing option. Now you can choose the specific phones and tablets you want to emulate. We use the device&nbsp;emulation built into <a href="https://developers.google.com/web/tools/chrome-devtools/iterate/device-mode/">Chrome DevTools</a> so your tests run in the same environment&nbsp;as your&nbsp;local development. SpeedCurve provides nine emulated phones &amp; tablets or you can build your own custom browsers and control settings like viewport size, device pixel ratio, connection speed and even packet rate loss.</p> <p><img style="display: block; margin-left: auto; margin-right: auto; max-width: 600px;" src="https://assets.speedcurve.com/img/blog/emulated_browsers.png" alt="Emulated Phones &amp; Tablets" width="100%" /></p> <h2>Flexible Testing</h2> <p>Previously, geographic regions used average network speeds, but the new version of SpeedCurve allows you to test specific network configurations for different browsers.&nbsp;For example, you can now emulate the experience of a phone on a 2G network in Brazil or a desktop PC on fibre in Germany.</p> <p>The new SpeedCurve architecture allows you to access all the granularity of <a href="http://www.webpagetest.org/">WebPageTest</a> via our user interface.</p> <p>You can also distribute checks more flexibly across your sites and the competitors you are benchmarking. For example,&nbsp;you might currently check your website several times a day&nbsp;but with the new version you can test production and pre-prod hourly&nbsp;to see the impact of each&nbsp;change, and drop your competitor checks to once a&nbsp;day.</p> <p>We are constantly working on the SpeedCurve codebase and this is the third&nbsp;complete re-write.&nbsp;Our changes are&nbsp;driven by customer feedback. So if you've provided feedback via <a href="https://github.com/SpeedCurve-Metrics/SpeedCurve/issues">Github</a> - thank you - we are listening and please keep posting suggestions. We love hearing how we can&nbsp;make SpeedCurve better.</p> Thu, 24 Mar 2016 00:00:00 +1300 Critical Blocking Resources https://speedcurve.com/blog/critical-blocking-resources <p>At SpeedCurve, we focus on metrics that capture the user experience. A big part of the user experience is when content actually appears in front of the user. Since stylesheets and synchronous scripts are the culprits when it comes to blocking rendering, we've rolled out some new metrics that focus on these critical blocking resources.</p> <p>The most helpful innovation we made is to highlight the critical blocking stylesheets and synchronous scripts in our waterfall charts. In the following example waterfall chart for <a href="http://espn.go.com/">ESPN</a>, notice how the critical stylesheets (green) and synchronous scripts (orange) have a red hash pattern. Not surprisingly, the Start Render metric is delayed until after the last of these critical blocking resources is done loading. The "scrubber" at the bottom of the waterfall (showing the screenshot at that point in time) confirms that rendering has been blocked up to this point. Explore an example of a&nbsp;<a href="https://speedcurve.com/demo/test/151124_GG_b27586e08f44f38825dfd058f12a5c7c/39tfnozeq94p1o0hndk1kpbg4vb7cg/">interactive waterfall chart.</a></p> <p><img style="max-width: 563px; display: block; margin-left: auto; margin-right: auto;" src="https://assets.speedcurve.com/img/blog/espn-critical-waterfall-2.png" alt="ESPN critical waterfall" width="100%" /></p><p>Not all scripts and stylesheets necessarily have a big impact on performance, so it's important to be able to tell the blocking requests when trying to improve the user experience. In the waterfall above we see that there's an early script (request #6, "lazysizes.js") that is <em>not</em> marked as a critical resource. That's because this script is loaded asynchronously and thus doesn't block rendering of the page. Since we only want to highlight resources that block rendering, asynchronous scripts are not highlighted.</p> <p>Similarly, in some cases it's possible to have stylesheets that don't block rendering of the main page. This typically happens with third party widgets that are loaded in an iframe, like the Twitter widget. Since stylesheets in iframes do not block the main page from rendering, they're not marked&nbsp;as critical resources.</p> <p>In addition to highlighting critical resources in the waterfall, the number of blocking&nbsp;stylesheets and synchronous scripts is shown under Other Metrics.&nbsp;</p> <p><img src="https://assets.speedcurve.com/img/blog/critical-metrics-2.png" alt="Other Metrics" width="100%" /></p> <p>Once we have a month of historical&nbsp;data for critical requests, we'll add charts to track this metric over time. This new visibility into the number of blocking requests, and which ones they are, will help teams&nbsp;create fast, enjoyable experiences for their users.</p> <h2>The critical rendering path</h2> <p>For more on what the critical rendering path is, why it matters so much and how to optimize asset delivery to ensure you don't block it <a href="https://www.igvita.com/">IIya Grigorik</a> gave a great overview of the topic at Velocity Conf 2014.</p> <p><iframe src="https://www.youtube.com/embed/YV1nKLWoARQ" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> Mon, 23 Nov 2015 00:00:00 +1300 User Timing and custom metrics https://speedcurve.com/blog/user-timing-and-custom-metrics <p>If you want to improve performance, you must start by measuring performance. But what should you measure?</p> <p>Across the performance industry, the metric that's used the most is "page load time" (i.e, "window.onload" or&nbsp;"document complete").&nbsp;Page load time was pretty good at approximating the user experience in the days of Web 1.0 when pages were simpler and each user action loaded a new web page (multi-page websites). In the days of Web 2.0 and single-page apps, page load time no longer correlates well with what the user sees. A great illustration is found by&nbsp;<a href="http://www.stevesouders.com/blog/2013/05/13/moving-beyond-window-onload/">comparing Gmail to Amazon</a>.</p> <p>In the last few years some better alternatives to page load time have gained popularity, such as start render time and <a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index">Speed Index</a>. But these metrics suffer from the same major drawback as page load time: they are ignorant of what content the user is most interested in on the page.</p> <blockquote>Any performance metric that values all the content the same is not a good metric.</blockquote> <p>Users don't give equal value to everything in the page. Instead, users typically focus on one or more&nbsp;critical design elements in the page, such as a product image or navbar. In searching for a good performance metric, ideally we would find one that measures how long the user waits before seeing this critical content. Since browsers don't know which content is the most important, it's&nbsp;necessary for website owners to put these performance metrics in place. The way to do this is to create custom metrics&nbsp;with User Timing.</p><h2>User Timing Spec</h2> <p>The <a href="http://www.w3.org/TR/user-timing/">W3C User Timing spec</a>&nbsp;provides an API for developers to add custom metrics to their web apps. This is done via two main functions: performance.mark and performance.measure.&nbsp;</p> <ul> <li><a href="http://www.w3.org/TR/user-timing/#dom-performance-mark">performance.mark</a>&nbsp;records the time (in milliseconds) since navigationStart</li> <li><a href="http://www.w3.org/TR/user-timing/#dom-performance-measure">performance.measure</a>&nbsp;records the delta between two marks</li> </ul> <p>There are other User Timing APIs, but mark and measure are the main functions. Once your page is chock full of marks and measures, the question arises as to how to actually collect these metrics so you can track them. Thankfully, because User Timing is an official W3C specification, many metrics services automatically extract and report these custom metrics in their dashboards. This is true for <a href="http://www.soasta.com/performance-monitoring/">SOASTA's mPulse</a>, <a href="http://www.webpagetest.org/">WebPageTest</a>, and SpeedCurve.&nbsp;</p> <h2>Sample Custom Metrics</h2> <p>While the User Timing API is simple, it can sometimes be difficult to know where and when to capture these marks and measures. This&nbsp;is due to the complexity of the browser's inner workings, primarily the way&nbsp;that stylesheets and synchronous scripts block parsing and rendering. Let's look at a few examples of likely custom metrics to gain a better understanding.</p> <p>A quick note about browser compatibility: User Timing is available in most browsers except Safari. In the examples below we use the native API, but in your live code you'll need to check for compatibility and either use a shim or wrapper. A <a href="https://gist.github.com/pmeenan/5902672">good polyfill</a> is available from Pat Meenan.</p> <h3>example 1: stylesheets done blocking</h3> <p>Loading a stylesheet blocks the entire page from rendering. This is true in all&nbsp;browsers as well as for stylesheets that are loaded dynamically. Therefore, knowing when stylesheets are done blocking is a good metric for understanding why rendering might start later than desired. Here's sample code for capturing this custom metric:</p> <pre class="brush: js; html-script:true; toolbar:false;">&lt;link rel="stylesheet" href="/sheet1.css"&gt; &lt;link rel="stylesheet" href="/sheet4.css"&gt; &lt;script&gt; performance.mark("stylesheets done blocking"); &lt;/script&gt;</pre> <p>The key to this snippet is making sure that it's placed below all the stylesheet LINK tags in the page. That's a reasonable requirement since most stylesheets are listed at the top of the page. While simple in appearance, some complex performance know-how is behind this snippet:</p> <ul> <li>Inline scripts are not executed until all previous stylesheets are downloaded, parsed, and applied to the page. Therefore, placing the inline script after the LINK tags ensures that the mark is set after all the blocking CSS has been processed.</li> <li>It's possible that a stylesheet might include <code>@import</code> which would pull in other stylesheets, for example, sheet1.css might cause sheet2.css and sheet3.css to be downloaded, parsed, and applied. Therefore, simply tracking a stylesheet's load time (with Resource Timing for example) isn't enough. Doing so would produce a measurement that was too short and underestimated the impact of stylesheet blocking.</li> </ul> <p>In order to produce a good (fast) user experience, it's important to understand what might be blocking your web app's rendering. The likely culprits are stylesheets and synchronous scripts, but often it's hard to disambiguate which is responsible for delayed rendering. This "stylesheets done blocking" custom metric is handy because if rendering starts well after the "stylesheets done blocking" metric, then the investigation should focus on synchronous scripts, which leads to our next example.</p> <h3>example 2: scripts done blocking</h3> <p>Synchronous scripts block rendering for all following DOM elements, so knowing when script blocking is finished is also important. Here's a snippet for capturing this measurement:</p> <pre class="brush: js; html-script:true; toolbar:false;">&lt;script src="a.js"&gt;&lt;/script&gt; &lt;script src="b.js" async&gt;&lt;/script&gt; &lt;script&gt; performance.mark("scripts done blocking"); &lt;/script&gt;</pre> <p>The inline script (which calls performance.mark) is guaranteed to execute after script a.js has been downloaded, parsed, and executed. On the other hand, the mark will be recorded before b.js is done loading because b.js has the async attribute. This behavior matches our goal of measuring script blocking because a.js blocks rendering, but b.js doesn't.</p> <p>Capturing an accurate "scripts done blocking" metric is a bit more challenging than its stylesheet counterpart. The reason is that, similar to stylesheets, the User Timing mark must be placed below all synchronous scripts. This can be difficult since websites frequently sprinkle scripts throughout the page. If that's the case, the mark measurement may occur after earlier DOM elements have rendered, and thus it doesn't accurately measure when rendering starts.</p> <p>Therefore, this example is only useful for pages that have their synchronous scripts in the HEAD. Even with this limitation, this custom metric can be very useful for pages that have large scripts where the blocking time is much longer than the download time due to parsing and execution. When looking at waterfalls for these types of pages, all the scripts finish downloading but there's still a long gap before rendering starts. With a "scripts done blocking" mark, it would be possible to identify long parse and execute times as the culprit for render blocking.</p> <h3>example 3: fonts loaded</h3> <p>If your site uses custom fonts, it's important to know&nbsp;that some browsers won't render the text that use those fonts until after the font file is downloaded. In other browsers the text may be rendered in a system default font and then re-rendered ("flash"ed) when the custom font is loaded. Therefore, a "fonts loaded" custom metric would be valuable to indicate when text elements were rendered.</p> <p>Currently, there is not an "onload" event for fonts. Nevertheless, there are techniques for observing fonts and determining when they load, for example, <a href="https://www.filamentgroup.com/lab/font-events.html">Font Loading Revisited with Font Events</a>&nbsp;by Scott Jehl from the Filament Group as well as <a href="https://github.com/typekit/webfontloader#events">Web Font Loader</a>&nbsp;used by Typekit and Google Fonts. You could use these&nbsp;to track when your fonts are done loading, and include a call to performance.mark to set the "fonts loaded" custom metric at that time.&nbsp;</p> <h3>example 4: hero images</h3> <p>A "hero image" is often the most important element in the page when it comes to user experience. The <a href="http://www.stevesouders.com/blog/2015/05/12/hero-image-custom-metrics/">Hero Image Custom Metrics</a>&nbsp;article describes an innovative technique for measuring when images are rendered. The snippet looks like this:</p> <pre class="brush: js; html-script:true; toolbar:false;">&lt;img src="hero.jpg" onload="performance.clearMarks('img displayed'); performance.mark('img displayed');"&gt; &lt;script&gt; performance.clearMarks("img displayed"); performance.mark("img displayed"); &lt;/script&gt;</pre> <p>The innovation is to take the greater of the image onload mark and the inline script mark. This accurately captures when the image is actually rendered. The image onload mark reflects the render time when the image download takes longer than any blocking resources. The inline script mark reflects the render time when the image downloads quickly but blocking resources prevent it from being rendered. In many cases, the most critical content in a page involves images, so this snippet is useful for a wide variety of custom metrics.</p> <h3>example 5: paragraph of text</h3> <p>Surprisingly, one of the most challenging custom metrics is determining when text is displayed. In addition to being blocked by stylesheets and synchronous scripts, text elements (P, SPAN, LI, DIV, etc.) can also be blocked from rendering if they use a custom font that takes a long time to download.</p> <p>If the text element does not use a custom font, then the time at which it renders is captured by simply putting an inline script after the text element:</p> <pre class="brush: js; html-script:true; toolbar:false;">&lt;p&gt;This is the call to action text element.&lt;/p&gt; &lt;script&gt; performance.mark("text displayed"); &lt;/script&gt;</pre> <p>If the text element DOES use a custom font, then the render time is the maximum of the inline script's mark and the font loading mark (see previous example). The key here is to use a pattern similar to the hero image where we record the "text displayed" mark twice: once in the font-loading snippet and again in the inline script after the text element. Additionally, we clear any previous marks of the same name before setting the new mark, thus ensuring that we get the maximum of the two values which properly reflects when the text is displayed.</p> <h3>example 6: Single Page Apps</h3> <p>One of the drawbacks of relying on page load time as a metric is that it doesn't measure user actions inside a single page app (SPA) where window.onload only fires once but the user might perform multiple actions, each of which should be measured. Custom metrics solve this problem, but it requires taking on the added responsibility of creating an appropriate <em>start</em> time.</p> <p>In order to show some sample code, lets assume we have a SPA that has an "Update" button. When clicked, an XHR or JSON request is launched to fetch new data. That returned data is passed to the updateData() function which changes the DOM. Here's sample code that measures this SPA user action:</p> <pre class="brush: js; html-script:true; toolbar:false;">&lt;input type=button value="Update" onclick="fetchData()"&gt; &lt;script&gt; function fetchData() { performance.clearMarks("start update"); performance.mark("start update"); // Do an XHR or JSON request that calls updateData() with the new data. } function updateData(data) { // Update the DOM with the new data. performance.clearMarks("finish update"); performance.mark("finish update"); perforance.measure("update data", "start update", "finish update"); } &lt;/script&gt;</pre> <p>Notice that the "start update" mark is the first JavaScript in the&nbsp;SPA action, and "finish update" is the last JavaScript executed in&nbsp;the SPA action. This ensures that the entire SPA&nbsp;action is measured, including downloading the XHR or JSON and updating the DOM. Also notice that we used performance.measure for this first time. That's because we want to get the delta relative to a start time <em>other than</em> navigationStart.</p> <h2>Custom Metrics in SpeedCurve</h2> <p>A big benefit of building custom metrics with User Timing is that many performance metric services automatically extract the User Timing marks and measures to show in your performance dashboards. WebPageTest does this, and since SpeedCurve is built on top of WebPageTest we do it as well.&nbsp;</p> <p>You can see your custom metrics in SpeedCurve by giving them a name in your Settings. In&nbsp;the speedcurve.com&nbsp;website, we use a custom metric called "heromark" to measure when the hero image (typically the chart at the top of the page)&nbsp;is displayed. We can give it a prettier name, "Hero Mark", using the form found under Settings:</p> <p><img style="max-width: 441px;" src="/img/custom-metric-settings.png" alt="" width="100%" /></p> <p>You can add multiple&nbsp;custom metrics to SpeedCurve Settings. Since some pages contain dozens of marks and measures, including ones set by third party scripts, this step ensures that only the most important custom metrics are shown.&nbsp;</p> <p>Custom metrics are visible on various SpeedCurve dashboards. For example, the Site dashboard shows a trendline&nbsp;of our "Hero Mark" custom metric over time.&nbsp;</p> <p><img src="/img/custom-metric-site.png" alt="" width="100%" /></p> <p>It's extremely valuable to see custom metrics on a waterfall chart. This allows you to "debug" if your custom metric is measuring the right thing. For example, in the waterfall below for speedcurve.com, we can see that the "Hero Mark" custom metric is blocked until all the preceding scripts&nbsp;(orange) and stylesheets (green) are done downloading. Using the thumbnails at the bottom confirms that this is when the hero image (the chart) actually gets displayed.&nbsp;</p> <p><img style="max-width: 734px;" src="/img/custom-metric-waterfall.png" alt="" width="100%" /></p> <p>No one knows your website as well as you do. Therefore, it's important that you add custom&nbsp;metrics that measure&nbsp;the content&nbsp;that you and your users care about most. This allows you to track the speed of&nbsp;what your user's are experiencing in both synthetic and RUM.</p> <p>If you're not already using SpeedCurve to create custom metrics and monitor your site's performance,&nbsp;<a href="/plan/trial/"><strong>set up your free trial here</strong></a>.</p> Thu, 12 Nov 2015 00:00:00 +1300 Performance budgets in&nbsp;action https://speedcurve.com/blog/performance-budgets-in-action <p>Performance budgets are an important tool for ensuring your site is delivering a great user experience. Steve first experienced performance budgets while Head Performance Engineer at Google. The practice of using budgets to track performance took off with Tim Kadlec's blog post <a>Setting a Performance Budget.</a> The idea is to identify your performance goals and track the metrics that help you achieve your goals.</p> <p>At SpeedCurve, we give performance budgets first-class status by tracking them in the Site dashboard. Here's an example of tracking a budget for image size.</p> <p><img src="https://assets.speedcurve.com/img/blog/budget.png" alt="Image performance budgets" width="100%" /></p> <p>Before setting your performance budgets, you first have to be monitoring your user experience. Only then can you set budgets and thresholds for improving your baseline user experience. This also allows you to quantify the improvements you're making and share success stories across the organization like "We just improved start render by 32% by reducing image requests to half the budgeted amount".</p><h2>What should my budget be?</h2> <p>There are various ways to approach setting a performance budget depending on the nature of your team, and what's going to make the most sense to them and motivate change:</p> <ul> <li>Be faster than your competition. Benchmark a variety of metrics and choose a target of 20% faster or less resources.</li> <li>Be faster than what&rsquo;s in production right now. This is great when doing a responsive redesign. Fork your code, rip out the old cruft, set new aggressive budgets and watch for alerts as you add new components and content back in.</li> <li>Adopt Human Computer Interface (HCI) guidelines such as those described in <a href="http://www.nngroup.com/articles/response-times-3-important-limits/">Response Times: The 3 Important Limits.</a> Aim for rendering the first meaningful content in under 1000ms.</li> <li>Base your budget on user research and design principles, such as <a href="https://speedcurve.com/blog/velocity-better-performance-through-better-design/">Better performance through better design.</a> What are your users actually trying to achieve and how long will they wait?</li> </ul> <p>SpeedCurve's <a href="https://speedcurve.com/demo/benchmark/a/1/a/a/30/speedindex/39tfnozeq94p1o0hndk1kpbg4vb7cg/">Benchmark dashboard</a> is a great way to see how you compare to your competitors for setting budgets. In the chart below, we can see why Smashing Magazine is so much faster - they're simply delivering a lot less JavaScript. If this was your site you could pick a metric like JS requests, set a lower budget and see if you can beat the competition!</p> <p><img src="https://assets.speedcurve.com/img/blog/home-requests.png" alt="Comparing Homepages" width="100%" /></p> <h2>Not all metrics are equal</h2> <p>It&rsquo;s vitally important you evaluate which metrics you&rsquo;ll budget against. For a long time now we&rsquo;ve known that metrics like the <a href="http://www.stevesouders.com/blog/2013/05/13/moving-beyond-window-onload/">page onload event are terrible indicators</a>&nbsp;of user experience and yet many performance tools and organisations still use it as a key indicator of performance.</p> <p>At SpeedCurve we often audit sites and it&rsquo;s surprising how even very large sites can be misled into delivering a very poor user experience by focusing on optimising for the wrong metric or taking a performance guideline too literally.</p> <p>The only metrics you should care about and champion across your organization are the ones that represent what a user is actually seeing as the page renders. Other metrics can be useful secondary measures to track the changing nature of your site but don't necessarily correlate to what makes a good user experience. Your users don't care how your website is constructed. What they really care about is how long it takes before they can engage with your awesome content. You need to focus on letting them see that content as quickly as possible!</p> <p>Herein lies the problem, the majority of metrics are not visual metrics based on what a user is actually seeing but rather events that reflect the processes running in the browser. These two sets of metrics can paint very different pictures and it&rsquo;s the reason SpeedCurve is built on <a href="http://www.webpagetest.org/">WebPageTest</a>&nbsp;the leading open source performance tool.</p> <p>WebPageTest records video and creates filmstrips of how a page loads in a real web browser leading to unique metrics based on visual analysis from a users perspective rather than what a browser thinks it&rsquo;s doing. It&rsquo;s an independent measure and provides two unique metrics we can budget against, <a href="http://support.speedcurve.com/knowledgebase/articles/640174-what-do-the-different-speedcurve-metrics-represent">start render</a>&nbsp;and&nbsp;<a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index">speed index.</a>&nbsp;These two metrics are a far better representation of the user experience than any of the built-in browser events.</p> <p><img src="https://assets.speedcurve.com/img/blog/filmstrip.png" alt="Performance filmstrips" width="100%" /></p> <h2>Better yet define your own custom metrics</h2> <p>While start render and speed index are great, ultimately the best metric is the one you define yourself. Like Twitter&rsquo;s <a href="https://blog.twitter.com/2012/improving-performance-on-twittercom">time to first tweet</a>&nbsp;you should be adding a custom metric that represents when the user can actually view and interact with your content. Custom metrics are easy to add with <a href="http://www.html5rocks.com/en/tutorials/webperformance/usertiming/">user timing marks</a>&nbsp;and SpeedCurve automatically picks up any marks added to your site without additional configuration. There can be challenges around instrumenting assets like images though and Steve recently discussed these in&nbsp;<a href="http://www.stevesouders.com/blog/2015/05/12/hero-image-custom-metrics/">hero image custom metrics.</a></p> <h2>Recommended metrics for performance budgets</h2> <p>In order of preference, here are the metrics we recommend you benchmark your user experience against:</p> <ol> <ol> <li>A single UX based custom metric for each template. E.g., the hero image on a product page.</li> <li>Speed Index. <a href="https://docs.google.com/presentation/d/1MtDBNTH1g7CZzhwlJ1raEJagA8qM3uoV7ta6i66bO2M/present?slide=id.p19">Paul Irish</a> recommends aiming for under 1000.</li> <li>Start render under 1000ms.</li> </ol> </ol> <p>Then for each of these metrics pick a budget, set alerts and monitor it as your codebase evolves and (hopefully) improves. You can also add secondary budgets like the size and number of requests to help correlate the construction of your code base with the user experience but the three above are the ones you should really focus on.</p> <h2>Performance budgets in action</h2> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://assets.speedcurve.com/img/blog/zillow-gray.jpg" alt="" width="50%" /></p> <p>See how a SpeedCurve budget alert led Zillow to discover a bug that increased its image size on mobile by 4x in <a href="http://engineering.zillow.com/bigger-faster-and-more-engaging-while-on-a-budget/">Bigger, Faster, and More Engaging while on a Budget.</a>&nbsp;Interestingly the increase in images didn&rsquo;t have a noticeable effect on Speed Index and the user experience. Does this mean Zillow could be delivering even more content than it does now as long as the initial content in the viewport renders just as quick? Breaking your performance budgets can lead to really interesting insights on how users interact with your content.</p> <p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://assets.speedcurve.com/img/blog/verge.jpg" alt="" width="50%" /></p> <p>Vox Media, makers of The Verge and SB Nation, benchmarked themselves against the competition and then <a href="http://product.voxmedia.com/2015/5/6/8561867/declaring-performance-bankruptcy">declared performance bankruptcy.</a>&nbsp;This is a great way to engage with your community and be transparent about the challenges of delivering a rich and fast user experience.</p> <blockquote> <p>It's oftentimes hard to give a direct answer when someone asks you, "how fast is your site?" so we're educating our team on how we quantify performance at Vox by explaining what each metric means and how they interplay with one another.<br /><span class="quote-byline">Dan Chilton - Front-End Engineering Director, Vox Media</span></p> </blockquote> <p>Etsy have also done a great job of publicly <a href="https://codeascraft.com/2015/07/13/q2-2015-site-performance-report/">reporting on performance</a> and meeting the budgets they set for themselves.</p> <p>Performance budgets are a great way to ensure you deliver an enjoyable, fast user experience. But they only work if you pick the right metrics and set the right thresholds. It's best to focus on metrics that more accurately measure the user experience, such as custom metrics, Speed Index, and start render. All of these metrics are available in SpeedCurve. We focus on measuring what users actually see, and tracking that so you can deliver it even faster.</p> Tue, 20 Oct 2015 00:00:00 +1300 Visual diffs on every deploy https://speedcurve.com/blog/visual-diffs-on-every-deploy <p>SpeedCurve now provides a visual diff of every deploy. A full resolution PNG&nbsp;is captured for each URL&nbsp;and each pixel is diffed with the previous deploy allowing you to easily spot any visual changes you may or may not have expected.</p> <p>The key to practising safe continuous deployment is to have a robust set of tools that give you immediate feedback on how your code has changed between deploys and its effect on the user experience. It's often very hard to spot all the visual changes in each&nbsp;deploy, especially in fast moving teams where a lot of the focus is on unit tests and other automated pass/fail systems. Visual diffs bring an increased level of tracking and confidence when you're able to compare any two deploys and see exactly what has visually changed.</p> <p><img src="https://assets.speedcurve.com/img/blog/diff-nav2.jpg" alt="" width="100%" /></p> <p>We do a visual diff every time you click "Test Now" on the Deploy dashboard or you use the <a href="https://api.speedcurve.com/">SpeedCurve API</a> to trigger a round of deploy testing. Integrating with the <a href="https://api.speedcurve.com/#deployments">Deploy API</a>&nbsp;is super easy and provides a robust set of metrics and before/after screenshots, visual diffs, <a href="https://speedcurve.com/blog/ux-focus-for-waterfalls-and-third-parties/">waterfall charts</a>, filmstrips and videos for each deploy. You can then compare any two deploys to see exactly what's changed over time.</p><h2>Spot the difference</h2> <p><img src="https://assets.speedcurve.com/img/blog/diff-nav.jpg" alt="Visual diff navigation" width="100%" /></p> <p>Sometimes when just scanning before/after screenshots themselves without a visual diff it can be very hard to spot subtle changes. In the Tommy John example above just one extra item has been added to the main navigation. Do you think you would have spotted it without the visual diff giving you a clue as to what has changed? The visual diff really highlights the pixel level changes and also shows the effect on other nav items when a new item is added.</p> <p><img src="https://assets.speedcurve.com/img/blog/diff-alignment.jpg" alt="Visual diff alignment" width="100%" /></p> <p>Quickly spot changes in grid and CSS alignment. Did you mean to move it or change a column width? With pixel by pixel matching it's easy to see exactly what's changed in your layout.</p> <p><img src="https://assets.speedcurve.com/img/blog/diff-background.jpg" alt="Visual diff background" width="100%" /></p> <p>Sometimes you want to see what hasn't changed as well as what has. Here all the foreground elements in white remain in exactly the same place while the background which has been swapped out becomes bright red, really drawing your attention immediately to what's changed.</p> <p><img src="https://assets.speedcurve.com/img/blog/diff-small-detail.jpg" alt="Visual diff small details" width="100%" /></p> <p>Surprisingly you can also spot the really small stuff when highlighted in red. Visual diffs are sensitive enough to pick up even single character changes helping you focus in on every single pixel that has changed from one deploy to another.</p> <p><img src="https://assets.speedcurve.com/img/blog/diff-filmstrip.jpg" alt="Filmstrips" width="100%" /></p> <p> <script src="//fast.wistia.com/assets/external/E-v1.js" async="" charset="ISO-8859-1"></script> </p> <div class="wistia_responsive_padding" style="padding: 40.71% 0 0 0; position: relative; margin-bottom: 25px;"> <div class="wistia_responsive_wrapper" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%;"> <div class="wistia_embed wistia_async_1aqietp6wj videoFoam=true" style="height: 100%; width: 100%;">&nbsp;</div> </div> </div> <p>We also provide side by side filmstrips and video comparisons which are fantastic not only for reviewing the visual differences&nbsp;but also putting in presentations so everyone across the organization can see exactly how long it takes to render the page from a user's perspective.</p> <h2>Make continuous deployment safe</h2> <p>Google uses visual diffs to spot release issues and make continuous deployment a safer practice. Brett Slatkin gave a great presentation at Velocity on the sorts of unexpected bugs you can discover with visual diffs. Check out the <a href="https://www.youtube.com/watch?v=1wHr-O6gEfc">video of Brett's talk</a>&nbsp;and learn more about how visual diffs help you track changes to what you're delivering to users.</p> <p><iframe src="https://www.youtube.com/embed/1wHr-O6gEfc" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> Mon, 12 Oct 2015 00:00:00 +1300 Multiple teams and multiple users https://speedcurve.com/blog/multiple-teams-and-multiple-users <p>This week we added support for organizations with multiple teams and multiple users.</p> <p><img src="https://assets.speedcurve.com/img/blog/model.png" alt="" width="100%" /></p> <p>One of the toughest challenges was simply working out what to call the different layers within the SpeedCurve app. Developers can spend years buried inside a data model but at the end of the day the UI has to be intuitive and easy to use! I hope we&rsquo;ve done that and if not we&rsquo;d love your feedback.</p><p>SpeedCurve now has a new <strong>&ldquo;organization&rdquo;</strong> and <strong>&ldquo;team&rdquo;</strong> structure that provides a great deal of flexibility when setting up a new account.</p> <p>Larger organisations or agencies can now add multiple teams to their <a href="https://speedcurve.com/pricing/">Enterprise plan.</a>&nbsp;Billing and budgets are held at the organization level making it easy to manage costs while giving new teams access to SpeedCurve monitoring for their projects.</p> <p>If you're an agency you can swap the idea of internal teams for clients. This lets you have an isolated set of dashboards for each client while easily swapping between them using the new menu if you belong to the organization. Each client only has access to their dashboards, while you have the ability to browse across dashboards.&nbsp;</p> <p>Multiple users can be invited to join a team and you control their view or edit permissions for any of the SpeedCurve dashboards. Users can belong to multiple teams and even multiple organizations.</p> <p>We also recently added new dashboard sharing links so you can either send someone a read-only private url (without them having to login) or invite a user to join your team.</p> <p>Here&rsquo;s a walk-through of the new account structure and features. If you're on an <a href="https://speedcurve.com/pricing/">Enterprise plan</a>&nbsp;you have access to these features now, otherwise get in touch to upgrade your existing account.</p> <script src="//fast.wistia.com/assets/external/E-v1.js" async="" charset="ISO-8859-1"></script> <div class="wistia_responsive_padding" style="padding: 56.25% 0 0 0; position: relative;"> <div class="wistia_responsive_wrapper" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%;"> <div class="wistia_embed wistia_async_9njjg0qa2h videoFoam=true" style="height: 100%; width: 100%;">&nbsp;</div> </div> </div> <p><br />Up next we&rsquo;re doing a complete redesign of the Settings UI which will provide a great deal more granularity for each Site being monitored.</p> Wed, 30 Sep 2015 00:00:00 +1300 UX Focus for Waterfalls and Third Parties https://speedcurve.com/blog/ux-focus-for-waterfalls-and-third-parties <p>At SpeedCurve, we want to help designers and developers have better insight into the user experience they're delivering. For websites, this means understanding when the critical parts of the page render and what might be blocking rendering.</p> <p><video autoplay="autoplay" loop="loop" width="100%"><source src="https://assets.speedcurve.com/img/blog/waterfall.mp4" type="video/mp4" /></video></p> <p>We've redesigned our waterfall chart to really highlight the relationship between the assets on the page and their affect on the user experience. Now as you move you mouse over the waterfall chart we show you exactly what a user is seeing at that millsecond while the page loads. This makes it much easier to identify any Javascript or&nbsp;CSS that might be blocking the page from rendering. I&nbsp;recently used this new combined waterfall and filmstrip view to identify a common issue with <a href="http://www.stevesouders.com/blog/2015/05/12/hero-image-custom-metrics/">hero images being delayed.</a></p><p>If rendering is blocked, it's important to figure out&nbsp;the cause. This isn't always easy, especially with the amount of third party content on websites today. Often the scripts and stylesheets that come with ads, analytics, and social widgets aren't delivered in a high performant way and can block the main content on the page from ever being seen by users. To help identify this possibility, you can use the Start Render line in the <a href="https://speedcurve.com/thirdparty/3/1/chrome/1/30/39tfnozeq94p1o0hndk1kpbg4vb7cg/">Third Party waterfall chart</a>.</p> <p><img src="https://assets.speedcurve.com/img/blog/thirdparty.png" alt="Third Party Start Render" width="100%" /></p> <p>The Third Party waterfall chart bundles HTTP requests into groups representing first and third parties. The grouping logic is based on technology developed at&nbsp;SpeedCurve. We draw a vertical line representing the Start Render point on top of the waterfall. Any third parties to the left on the line have the potential of blocking rendering. You can click on each third party to see more detail and go to the <a href="https://speedcurve.com/test/150622_0Z_Z6J/39tfnozeq94p1o0hndk1kpbg4vb7cg/">full waterfall chart</a>&nbsp;to investigate the filmstrip thumbnails.</p> <p>Waterfall charts are great. Adding the ability to see when&nbsp;rendering occurs and how it's affected by third parties makes them even an even better tool for designers and developers to create great experiences for their users.</p> Tue, 23 Jun 2015 00:00:00 +1200 The language and metrics of UX evolve at Velocity 2015 https://speedcurve.com/blog/the-language-and-metrics-of-ux-evolve-at-velocity-2015 <p><em>Originally published on the&nbsp;<a href="http://radar.oreilly.com/2015/06/devops-developers-designers-ux-metrics-velocity.html">O'Reilly Radar Blog</a></em></p> <p>I&rsquo;ve attended four&nbsp;<a href="http://velocityconf.com/">O&rsquo;Reilly Velocity conferences</a>&nbsp;over the last year, and I was struck by a notable shift in the conversations at Velocity in Santa Clara, Calif. Many speakers and attendees have started to change their language and describe the experience&nbsp;of their websites and apps from the user&rsquo;s perspective.</p> <p>The balance has shifted from just talking about how fast or reliable a particular&nbsp;system&nbsp;is to the overall experience&nbsp;a&nbsp;user&nbsp;has when they interact with and experience a product. Many people are now looking at themselves from the outside in and developing more empathy for their users. The words &ldquo;user&rdquo; and &ldquo;user experience&rdquo; were mentioned again and again by speakers.</p> <p>Here are recent talks from Velocity and other events that highlight this shift to UX concerns.</p><h2>The next billion users</h2> <p>At Velocity 2015 in Santa Clara,&nbsp;<a href="http://www.brucelawson.co.uk/">Bruce Lawson</a>&nbsp;described the dramatic growth of connected users in Asia and Africa, while highlighting the challenge faced when trying to deliver great experiences to a broad range of devices. Companies looking to these regions for their next billion users need to keep in mind that these users are on underpowered phones over slow networks with high data costs.</p> <p><iframe src="https://www.youtube.com/embed/BHO70H9tvqo" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> <h2>Reaching everyone</h2> <p>The techniques required to reach such a broad audience were covered by&nbsp;<a href="http://timkadlec.com/">Tim Kadlec</a>&nbsp;at Velocity 2015 in Santa Clara, who took us through the process of creating a high-performant responsive site that can effectively reach a diverse global audience. Here&rsquo;s Kadlec&rsquo;s related talk from Velocity 2014 in New York:</p> <p><iframe src="https://www.youtube.com/embed/fHcl5lpgQ1g" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> <h2>The path to performance</h2> <p>Successful performance begins far earlier than development. So, how do you get your entire team excited by it? At Velocity 2015 in Santa Clara,&nbsp;<a href="http://kovalc.in/">Katie Kovalcin</a>&nbsp;discussed everyone&rsquo;s role in performance and how to get all teammates caring.</p> <p> <script class="speakerdeck-embed" src="//speakerdeck.com/assets/embed.js" async="" data-id="0754d7ddff3a45819e900966c2592d6d" data-ratio="1.77777777777778"></script> </p> <h2>Design + performance</h2> <p><a href="http://stevesouders.com/">Steve Souders</a>&nbsp;really captured the growing crossover of design and performance cultures within organizations and the desperate need to move from purely technical instrumentation to a focus on custom metrics that capture what the user actually sees as the page loads. Below you&rsquo;ll find Souders&rsquo; related talk from&nbsp;<a href="http://fluentconf.com/javascript-html-2015">Fluent 2015</a>:</p> <p><iframe src="https://www.youtube.com/embed/A9rKO2rhYYM" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> <h2>Visualizing performance data in engaging ways</h2> <p>In the talk I gave, I focused on how performance data can be visualized in ways that engage the wider team, ensuring that everyone across the organization understands the impact of their work on the user experience:</p> <p><iframe src="https://www.youtube.com/embed/lEhmmTlbCss" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> <p>Coming from a design background, I&rsquo;m happy discussions at Velocity are focusing on the importance of viewing performance from the user&rsquo;s perspective. The key is ensuring that the design and development process keeps the user and their experience of a product as a constant focus.</p> <h2>Operations has users, too</h2> <p>Running and maintaining high-performance, highly-available sites and apps necessitates&nbsp;a near obsession with monitoring and metrics. With operational metrics come a host of tools, and the current state of these tools is unfortunately well behind the end-user customer experience.&nbsp;Two talks focused on the need for a UX-focused approach for operations tools, one&nbsp;<a href="http://cdn.oreillystatic.com/en/assets/1/event/122/When%20UX%20meets%20operations%20Presentation.pdf">from the perspective of UX designer</a>&nbsp;Tim Sheiner, the other from Rob Treat,&nbsp;who&nbsp;<a href="http://www.slideshare.net/xzilla/whatopscanlearnfromdesign">uses ops tools on a daily basis</a>. Both stressed the importance of understanding the goals, tasks, and mindset of operations teams when building tools, notably for&nbsp;handling stressful situations like site outages.</p> <p>Velocity was one of the early places where DevOps originated, bringing developers and ops folks closer together. Last week, we witnessed an additional convergence of developers, ops, and designers. It&rsquo;s exciting that Velocity is helping these siloed groups find ways to share with and learn from each other. Much of this thinking comes from Lara Callender Hogan&rsquo;s book&nbsp;<a href="http://shop.oreilly.com/product/0636920033578.do?intcmp=il-webops-books-videos-product-na_20150601_radar_mark_zeman_velocity_highlight_post">Designing for Performance</a>. If you want to produce amazing, fast, enjoyable user experiences, I recommend you read Hogan&rsquo;s book and review the sessions highlighted above. And keep your focus on the user.</p> Thu, 11 Jun 2015 00:00:00 +1200 Responsive Design Dashboard https://speedcurve.com/blog/responsive-design-performance-testing <p>The dramatic growth of mobile traffic has created an urgency for websites to adapt to different screen sizes. <a href="http://alistapart.com/article/responsive-web-design">Responsive design</a> is the preferred technique for making web content adapt to the device on which it's viewed. This approach ensures that the appropriate content is rendered in an appropriate way on phones, tables, laptops, and any other screen being used.</p> <p>A corollary to responsive design is the need for performance. Delivering content that's customized for a particular device isn't enough if its delivery is slow and frustrating. Indeed, last week <a href="http://www.huffingtonpost.com/2015/04/17/google-search-update_n_7085642.html">Google announced</a> that websites need to deliver their design appropriately and quickly on mobile devices or they will be demoted in Google's search results.</p> <p>How can you know if your website matches these standards for adaptive content and speed? SpeedCurve's <a href="https://speedcurve.com/features/responsive/">Responsive Design Dashboard</a> answers both questions in one view.</p> <p style="text-align: center;"><img src="//speedcurve.com/img/blog/responsive-filmstrip.png" alt="Responsive Filmstrips" width="100%" /></p><p>The Responsive Design Dashbard shows the URL's filmstrip across different viewport sizes: 320x568, 568x320, 768x1024, 1024x768, 1280x768, and 1366x768. Viewing these thumbnails over time reveals how quickly the content is rendered. Similarly, you can see how the site's design adapts to different screen sizes.</p> <p>The Responsive Design Dashboard is created using Chrome's mobile browser emulation feature. In addition to specifying the viewport size, the User-Agent string is also adapted to correspond to the emulated device's default characteristics. (Soon we'll adapt the network settings, as well.)</p> <h2>Asset Breakpoints</h2> <p>The filmstrips show how the website adapts to different visual breakpoints. It's also important to think about <em>asset breakpoints</em> - how the size and number of requests adapts based on the screen size. For example, we know we don't want to send huge desktop images to smaller screens.</p> <p>The Responsive Design Dashboard shows asset breakpoints by revealing information about HTTP requests at each viewport size. The screenshot below, for example, paints a picture that we like to see where smaller screens receive fewer bytes, while larger screens get a heavier experience.</p> <p style="text-align: center;"><img src="//speedcurve.com/img/blog/responsive-sizes.png" alt="Responsive Sizes" width="100%" /></p> <p>The Responsive Design Dashboard perfectly captures what SpeedCurve is about: the intersection of design and performance. Understanding how a design adapts across viewports to tracking kilobytes by Content-Type. We're having fun bringing you the information you need to create great user experiences.</p> Wed, 29 Apr 2015 00:00:00 +1200 Mark+Steve, Performance+Design https://speedcurve.com/blog/mark-plus-steve-performance-plus-design <p>I'm excited to announce that I've joined <a href="https://speedcurve.com/">SpeedCurve!</a></p> <p>When SpeedCurve was just a twinkle in Mark's eye, he contacted me about the concept and I encouraged him that a commercial version of <a href="http://www.webpagetest.org/">WebPageTest</a> was needed. When I saw the early versions of SpeedCurve, I was blown away. Mark presents traditional performance data in a way that is more compelling, revealing his strong design background.</p> <p>Mark has pioneered this new territory where performance and design overlap. It's exciting to say "overlap". Many times there's little interaction between designers and performance engineers. When there is interaction, it can feel adversarial with no one wanting to give any ground. And yet, designers and performance engineers are after the same thing: creating a great user experience!</p> <p>Design and performance are connected, like the yin and yang. They aren't opposing forces, but instead complement each other. Users want an experience that is rich <em>and</em> fast. The trick is figuring out how to do that. That's where SpeedCurve comes in.</p><p>SpeedCurve focuses on measuring the interplay between design and performance. Rather than providing typical performance metrics that focus on resource downloads, SpeedCurve focuses on metrics and visualizations that correspond more closely to the user experience, such as:</p> <ul> <li>the <a href="//speedcurve.com/features/responsive/">responsive design dashboard</a> that shows pages rendering in different viewports, orientations, and connection speeds</li> <li><a href="//speedcurve.com/features/custom/">custom metrics</a> that measure what you decide is critical to your users</li> <li>the impact of <a href="//speedcurve.com/features/thirdparty/">third party content</a> on your site</li> <li>whether you're sticking to your <a href="//speedcurve.com/features/budgets/">performance budget</a></li> </ul> <p>I've been working on performance for more than a decade and have witnessed (and instigated) a lot of changes. I'm excited about this movement to bring design &amp; performance closer together. In the end it'll produce what matters the most: a great web experience for users.</p> <p>Mark and I are a good team to work on this - with his background heavy in design and mine in performance. Today we just re-launched the site with a major design overhaul and many new features. (Plus a new pay-as-you-go pricing plan that actually lowers costs for most of our existing customers!) We hope you'll give SpeedCurve a try, and that you'll find it useful for understanding what your users are experiencing and how to make that experience richer and faster.</p> <p style="text-align: center;"><img style="width: 100%; max-width: 630px;" src="//assets.speedcurve.com/img/mark_and_steve_small.jpg" alt="" /><br /><br /> <em>Steve and Mark at the SpeedCurve re-launch in New Zealand.</em></p> Tue, 24 Mar 2015 00:00:00 +1300 Velocity: Better performance through better&nbsp;design https://speedcurve.com/blog/velocity-better-performance-through-better-design <p>Improve web performance by improving your design process&hellip; it needs to be iterative, mindful, principled and visual.</p> <p>At my third Velocity conference for the year (this time in beautiful Barcelona) my keynote presentation explored the ways in which a thoughtfully developed design process can lead to higher functioning teams and better web performance.</p> <p><iframe src="//www.youtube.com/embed/DFImM0r4EpE" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p><p>I start out by suggesting that before a project is launched the team must sit down and design the process that they are going to use to reach a solution. This process needs to be guided by a project specific set of principles, higher level than requirements, identifying the core &lsquo;values&rsquo; and priorities of the project. A performance budget should be represented in one of the principles and will guide the team as they navigate through each iteration.</p> <p>Small multi disciplinary teams are key to executing this better designed approach. An agile style of working results, one which no longer excludes designers but has the entire team -&nbsp; designer, developer, researcher and the client, revolving around a prototype. Iteration after iteration is refined through the team effort.</p> <p>Once again I talk about the importance of effective visualization for engaging the entire team and beyond, to the wider organization.</p> <p>What tactics do you use in your organization to improve your design process?</p> <p>How is performance incorporated into discussions within your project teams?</p> <p>Are you working in Agile and are designers part of that process?</p> <p>What metric are you choosing to share with the wider organization around your project - and how?</p> Mon, 17 Nov 2014 00:00:00 +1300 Velocity: A better waterfall chart https://speedcurve.com/blog/velocity-a-better-waterfall-chart <p>The way we visualize performance data can have an impact on how we interpret and communicate performance issues within our teams.</p> <p>In this talk from <a href="http://velocityconf.com/velocityny2014">Velocity New York</a>&nbsp;I explored the importance of data visualization and presented some of my own explorations into re-imagining the classic waterfall chart which is the mainstay of front-end performance analysis.</p> <p>Skip to 15:30 if you just want to see the data visualization experiments, and you can play with them directly on&nbsp;<a title="SpeedCurve LAB" href="http://lab.speedcurve.com">lab.speedcurve.com</a></p> <p>One of these experiments was also turned into a <a href="https://github.com/zeman/perfmap">performance heatmap bookmarklet.</a></p> <p><iframe src="//www.youtube.com/embed/Olwm3l4rfns?rel=0" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p><p>To date waterfall charts have been a mainstay in visualizing web performance, giving us details on each asset and how it cumulatively effects the load time of a web page. But there are many ways of visualizing performance: histograms, flame charts, heatmaps, frequency tails, and colony graphs to name just a few.</p> <p>I&nbsp;explored the strengths and weaknesses of various types of charts and how well suited they are at answering a range of performance questions from both the perspective of a manager looking for quick high level answers and a developer needed to dig into the details. It&rsquo;s important to start with the questions about performance first and then find the tools, metrics, and visualizations to best answer a question rather than inferring problems and answers from an existing metric.</p> <p>Often charts are rendered along just two dimensions, which can limit the amount of information displayed and hide important detail. I&nbsp;presented several new visualizations that introduce depth, animation, and interaction to reveal performance bottlenecks and insights at both a holistic and detailed level.</p> <p>These new visualizations make the most of modern browser techniques allowing greater interaction and demonstrating just how powerful the modern browser has become at visualizing it&rsquo;s own performance.</p> <p>Let me know which&nbsp;visualizations&nbsp;you enjoyed the most and I'll add them to SpeedCurve!</p> Tue, 16 Sep 2014 00:00:00 +1200 Velocity: Responsive in the wild https://speedcurve.com/blog/velocity-responsive-in-the-wild <p>I was lucky enough to give a Lighting Demo at <a href="http://velocityconf.com/velocity2014">Velocity Conference</a> in Santa Clara. The focus was on research I conducted into 250 responsive websites and how well optimized for performance they were.</p><p><iframe src="//www.youtube.com/embed/3Lhwso2GaN0?rel=0" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> <p> <script class="speakerdeck-embed" src="//speakerdeck.com/assets/embed.js" async="" data-id="61b543b0dec80131ffee2ad9291baba4" data-ratio="1.77777777777778"></script> </p> <h2>Methodology</h2> <p>250 responsive websites were loaded at 17 different viewport widths between 320px and 1920px using WebPagetest. The number of requests and size of assets were captured for each width and used to build a visulization that revealed the cross-section of a site's performance breakpoints rather than it's visual breakpoints.</p> <h2>Results</h2> <p>Averages can hide the patterns in data so after visually sorting and grouping the cross sections of the sites we see that there are distinct patterns and approaches used by sites to tune their assets for performance at different widths.</p> <p><img src="https://assets.speedcurve.com/img/blog/responsive-stack.png" alt="" width="100%" /></p> Wed, 25 Jun 2014 00:00:00 +1200 Faster EC2 testing agents https://speedcurve.com/blog/faster-ec2-testing-agents-for-speedcurve <p>As of the 1st of June SpeedCurve has switched to using faster testing agents at Amazon EC2 data centers. As web pages become more Javascript and resource heavy I've noticed more and more pages max out the CPU while performance testing.</p><p>SpeedCurve now uses EC2 m1.medium instances which have 3.75GB of RAM with faster CPU and network performance. For CPU heavy pages you should see a drop in overall load time. The connection speed for testing agents is still throttled to an average US connection speed so simple pages may not improve as much.</p> <p>Overall this should provide more consistent results that are more on par with what an average user of your website might experience.</p> <p>Do note that SpeedCurve's strength is competitive benchmarking and detailed build analysis. If you're after actual on the ground performance numbers then we suggest combining <a href="https://speedcurve.uservoice.com/knowledgebase/articles/355134-synthetic-vs-real-user-monitoring-rum">SpeedCurve with Real User Monitoring.</a>&nbsp; &nbsp;</p> Sun, 01 Jun 2014 00:00:00 +1200 Speed Index now available https://speedcurve.com/blog/speedindex-now-available-on-speedcurve <p><a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index">Speed Index</a>&nbsp;is now available on SpeedCurve. Choose "SpeedIndex" from the top right of the main graphs.</p> <p><img src="https://assets.speedcurve.com/img/blog/speedcurve-speedindex.png" alt="Speed Index" width="100%" /></p><p><a href="https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index">Speed Index</a>&nbsp;is an important measure of a user's experience as the page loads. It's based on video analysis of how the page loads over time. Here's a great video from Paul Irish introducing Speed Index at the recent <a href="http://www.feopsconf.com/">Front End Ops Conference.</a></p> <p><iframe src="//www.youtube.com/embed/E5lZ12Z889k?rel=0" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> Wed, 28 May 2014 00:00:00 +1200 IE11 and average speed update https://speedcurve.com/blog/ie11-and-average-speed-update <p>To keep inline with browser trends and average connection speeds SpeedCurve will begin updating the test setting every quarter.</p> <p>For Q2 2014 we're switching to IE11 which is now the most popular version of IE according&nbsp;to <a href="http://www.akamai.com/html/io/io_dataset_v2.html#stat=browser_ver&amp;top=10&amp;type=line&amp;start=20140101&amp;end=20140317&amp;mobile_browser=Internet%20Explorer:11~8~10~9~7~6">Akamai</a>&nbsp;and <a href="http://gs.statcounter.com/#browser_version_partially_combined-ww-monthly-201312-201402">StatsCounter</a>&nbsp;and the average connection speed has been updated to 9.8Mbps download, 2.5Mbps upload with a 10ms latency. The 9.8Mbps download speed is based on the latest <a href="http://www.akamai.com/stateoftheinternet/">State of the Internet</a> report from Akamai.&nbsp;</p> Tue, 01 Apr 2014 00:00:00 +1300 SpeedCurve wins Webstock BNZ Start-Up Alley https://speedcurve.com/blog/speedcurve-wins-webstock-bnz-start-up-alley <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/webstock-logo.svg" alt="" /></p> <p>I'm stoked that SpeedCurve has been chosen&nbsp;as one of two winners in the&nbsp;<a href="http://www.webstock.org.nz/14/supalley/">2014 Webstock Start-Up Alley.</a>&nbsp;I'll be using the 10k prize money and two flights to the US to attend&nbsp;<a href="http://velocityconf.com/velocity2014">Velocity Conf</a>&nbsp;in San Fran in June and New York in September.</p> Thu, 23 Jan 2014 00:00:00 +1300 Performance tips for building responsive&nbsp;sites https://speedcurve.com/blog/performance-tips-for-building-responsive-sites <p>The following article was originally published in the <a href="http://calendar.perfplanet.com/2013/">2013 Performance Calendar.</a> There's 31 great articles to explore in the calendar including Steve Souders's <a href="http://calendar.perfplanet.com/2013/browser-wishlist-2013/">browser wishlist</a> and Tim Kadlec's take on what it takes to <a href="http://calendar.perfplanet.com/2013/holistic-performance/">create a performance culture.</a></p> <p>----</p> <p>Responsive Web Design (RWD) is now a well established technique yet it&rsquo;s adoption is still surprisingly low. Guy Podjarny&rsquo;s <a href="http://www.guypo.com/mobile/roughly-1-in-8-websites-is-responsive/" target="_blank">recent research</a> shows that only one in eight websites is responsive. Often when responsive sites are designed the approach is primarily from a visual design perspective and teams struggle with the complexity of changing design and navigation patterns let alone any performance concerns, which become secondary. This can lead to serving the same sized assets to all browser widths resulting in a responsive site that is visually scaled but not performance optimised. On average responsive sites at 320 pixels wide are only 8% small than at 1600 pixels wide. Unsurprisingly these <a href="http://blog.cloudfour.com/responsive-web-design-is-solid-gold/" target="_blank">performance concerns</a> and a lack of established techniques have made some hesitate when considering RWD adoption.</p> <p><a href="http://www.guypo.com/mobile/what-are-responsive-websites-made-of/"><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/guypo-rwd-page-size.png" alt="Page size by file type" /></a></p> <p>Responsive page sizes across different screen resolutions. Source: <a href="http://www.guypo.com/mobile/what-are-responsive-websites-made-of/" target="_blank">Guy Podjarny</a></p><p>However, we do now have a full set of techniques to effectively deliver highly performative sites that not only visually scale across devices but also deliver code and assets tuned to the width of a device. Sites need to be built utilising these techniques from a mobile first (and performance first) perspective.</p> <p>Here are three key techniques that you can use to optimise performance using mobile as your starting point. Let&rsquo;s tackle these in order of the page load&hellip;</p> <h2>Inline the initial experience (within 14k if&nbsp;possible)</h2> <p>First impressions do count. While it&rsquo;s easy to throw jQuery, a framework like Bootstrap/Foundation and web fonts on a page you trade ease of use for performance. It&rsquo;s increasingly a <a href="http://gs.statcounter.com/#desktop+mobile-comparison-ww-weekly-201342-201351" target="_blank">mobile world</a> and your main aim should be to engage users as quickly as possible.</p> <p>Ilya Grigorik&rsquo;s recent Velocity conference <a href="http://www.youtube.com/watch?v=YV1nKLWoARQ" target="_blank">presentation</a> explored the browser's critical rendering path and highlighted exactly what it takes to deliver a mobile page within one second. Surprisingly you&rsquo;ve got just one HTTP request and only 14k of HTML to play with to get content in front of users. One of the only ways to achieve this is by inlining any &ldquo;above the fold&rdquo; CSS and JS required to render the first screen of content. Recently Grigorik has been championing this approach and the <a href="https://developers.google.com/speed/pagespeed/insights/" target="_blank">Google Pagespeed Insight</a> rules have been updated to reflect this best practice with recommendations on how to <a href="https://developers.google.com/speed/docs/insights/PrioritizeVisibleContent" target="_blank">reduce the size of "above the fold" content.</a></p> <h2>Control and branch the loading of CSS and&nbsp;JS</h2> <p>There are plenty of automated front-end optimisation tools available like modpagespeed and CloudFlare but being a bit old-school and craft-orientated I prefer the ability to control the load order and optimise not only the individual assets but their sequencing as well.</p> <p>Often responsive sites combine the desktop and mobile CSS and JS into one set of files but this results in delivering unnecessary code to the width you&rsquo;re viewing. You can optimise what&rsquo;s delivered by using javascript to detect the width of the page and then request specific styles and javascript appropriate to that width. There might even be whole features or different navigation patterns introduced or removed at different widths to optimize the size of the user experience.</p> <p><a href="https://github.com/blog/1559-github-s-on-your-phone"><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/github-desktop-mobile.png" alt="Github desktop vs mobile" /></a></p> <p>Github write mobile specific CSS and JS resulting in much smaller and faster pages. Source: <a href="https://github.com/blog/1559-github-s-on-your-phone" target="_blank">Github Blog</a></p> <p>Here&rsquo;s a few libraries you can use to enable the decision making and branching of assets as the page loads: <a href="https://github.com/scottjehl/eCSSential" target="_blank">eCSSential,</a> <a href="http://foundation.zurb.com/docs/components/interchange.html" target="_blank">Interchange,</a> and good old <a href="http://modernizr.com/" target="_blank">Modernizer.</a></p> <h2>Shrink and art direct your&nbsp;images</h2> <p>Images often make up the largest set of assets on a page. There are two key considerations here - serving the right image to the right width and being able to art direct the image for smaller screen sizes, i.e. crop into the focal point of an image for smaller widths.</p> <p>If possible eliminate an image altogether by using an <a href="http://fontello.com/" target="_blank">icon font</a> for icons and small graphics. Alternatively use <a href="http://css-tricks.com/using-svg/" target="_blank">SVG images</a> for logos and other simple graphics. Both these techniques use vector data rather than pixels so they are small in file size and scale efficiently across all sizes including high resolution retina screens.</p> <p>However when it comes to photos you need to stick with pixel based formats and this requires switching between different sized images to save bandwidth. <a href="https://github.com/scottjehl/picturefill" target="_blank">Picturefill</a> is an interim polyfill for responsive images allowing you to curate which image gets served to which width.</p> <p>Often image generation can be a real chore and rather than manually outputting images in different formats and sizes your backend or CMS should be doing the hard work for you. <a href="http://www.cdnconnect.com/" target="_blank">CDN Connect</a> is a promising new service that allows you to transform a single high quality image into many different formats and has an impressive range of <a href="http://www.cdnconnect.com/docs/image-api" target="_blank">methods</a> to crop, filter and manipulate images. All CMS's should be offering this level of image manipulation and caching.</p> <p>While you&rsquo;re outputting your images to different formats consider adding <a href="http://www.igvita.com/2013/03/07/faster-smaller-and-more-beautiful-web-with-webp/" target="_blank">WebP</a> into the mix. It&rsquo;s a new image format developed by Google that&rsquo;s 30-40% smaller than a jpeg. Currently WebP is only supported in Chrome and Firefox are considering adding support. <a href="http://davidnewton.ca/responsive-images-picturefill-type-attribute" target="_blank">David Newton</a> has created a <a href="https://github.com/nwtn/picturefill" target="_blank">fork of Picturefill</a> that adds WebP and SVG detection so you can not only deliver the right size but the smallest format to different browsers.</p> <h2>Case study: the new responsive Guardian&nbsp;site</h2> <p><a href="http://speedcurve.com/demo/"><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/speedcurve-guardian-size.png" alt="SpeedCurve Demo" /></a></p> <p>Comparison of page size and assets types across different responsive widths. Source: <a href="http://speedcurve.com/demo/" target="_blank">SpeedCurve</a></p> <p>A great example using the above techniques is the new Guardian newspaper website, currently in <a href="http://www.theguardian.com/uk?view=mobile" target="_blank">alpha.</a> On average it&rsquo;s start render time is 3 seconds faster than the current Guardian site and the mobile width inlines CSS and is 42% smaller overall, leading to a 1 second saving over the desktop width.</p> <p><a href="http://speedcurve.com/demo/"><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/speedcurve-guardian-loaded.png" alt="SpeedCurve Guardian" /></a></p> <p>Comparison of full loaded time for new Guardian responsive site (Guardian NGW) vs current Guardian site and the New York Times. Source: <a href="http://speedcurve.com/demo/" target="_blank">SpeedCurve</a></p> <p>The Guardian have released their <a href="https://github.com/guardian/frontend" target="_blank">responsive code base</a> on Github so you can easily dig through their development setup and see these techniques in action.</p> <h2>Establish a performance baseline and then go performance&nbsp;first</h2> <p>Performance optimisations like these are often invisible and it can be hard to demonstrate a return on investment without clear metrics in place. Some of these techniques can require a significant amount of work and it&rsquo;s critical you establish a performance baseline first and then experiment with the techniques above to clearly show the improvements in user experience. There are great tools available to monitor the actual in <a href="https://www.pingdom.com/rum/" target="_blank">browser speed</a> and <a href="http://speedcurve.com/" target="_blank">benchmark your site</a> against others.</p> <p>Putting all these techniques together you can dramatically improve the performance of your responsive site. There&rsquo;s really no excuse for serving the same large sized assets across all browser widths. Make your responsive website respond not only to changing design patterns but to the browser environment it&rsquo;s being served into. <a href="http://bradfrostweb.com/blog/web/mobile-first-responsive-web-design/" target="_blank">Go mobile first</a> and performance first when designing and coding your next responsive website!</p> <p>Thanks to <a href="http://www.guypo.com/" target="_blank">Guypo</a> for his ongoing responsive research and <a href="http://www.patrickhamann.com/" target="_blank">Patrick Hamann</a> from The Guardian for letting me share their SpeedCurve dashboard.</p> Thu, 26 Dec 2013 00:00:00 +1300 New weekly emails https://speedcurve.com/blog/weekly-frontend-performance-emails <p>I've redesigned the weekly email reports to provide more trending information so you can compare week on week performance improvements. They're nice simple visualizations for forwarding around your whole team.</p> <p><img style="max-width: 660px;" src="https://assets.speedcurve.com/img/blog/email-weekly.png" alt="Weekly frontend performance email" width="100%" /></p><p>Let me know what you'd like to see added to these emails.</p> Wed, 06 Nov 2013 00:00:00 +1300 Share dashboards, basic auth and export HAR's https://speedcurve.com/blog/share-dashboards-basic-auth-and-export-hars <p>New features:</p> <ol> <li>Share your dashboard via a private url. Find the link on the "account" page.</li> <li>During site setup you can now add a user/pass for developments sites using basic authentication.</li> <li>On the individual test pages below the waterfall are links to the underlying WebPagetest waterfall and ability to export a HAR file.</li> </ol> Tue, 15 Oct 2013 00:00:00 +1300 SpeedCurve dashboard walkthrough https://speedcurve.com/blog/speedcurve-dashboard-walkthrough-video <p> <script charset="ISO-8859-1" src="https://fast.wistia.com/assets/external/E-v1.js"></script> </p> <div class="wistia_embed wistia_async_er7vm722y6 videoFoam=true" style="width: 540px; height: 304px; margin-bottom: 25px;">&nbsp;</div> <p>See how powerful the SpeedCurve dashboard is for digging into your website's front-end performance.</p><p>Let me know which parts of the dashboard you'd like to learn more about.</p> Tue, 08 Oct 2013 00:00:00 +1300 Live! https://speedcurve.com/blog/live <p><img src="https://assets.speedcurve.com/img/blog/launch.jpg" alt="Helena, Mark &amp; Bruno" width="100%" /></p> <p>SpeedCurve is now live! To mark the occasion I took the day off work and Helena &amp; Bruno helped send out the launch emails.</p><p>All done while stuffing our faces with cake at Vevo cafe in Titirangi, Auckland. We watched the stats explode and 3 people signed up for subscriptions before we finished our hot chocolates. Start how you intend to continue I say!</p> Tue, 08 Oct 2013 00:00:00 +1300 SpeedCurve elevator pitch https://speedcurve.com/blog/speedcurve-elevator-pitch-video <p> <script charset="ISO-8859-1" src="https://fast.wistia.com/assets/external/E-v1.js"></script> </p> <div class="wistia_embed wistia_async_o1xrcypjsz videoFoam=true" style="width: 540px; height: 304px; margin-bottom: 25px;">&nbsp;</div> <p>I've been having a blast over the last couple of weeks putting an intro video together for SpeedCurve.</p><p>Big thanks to Matt from <a href="http://www.assemblyltd.com/">Assembly</a>&nbsp;for casting an eye over my dodgy 3D AfterEffects camera work.</p> <p>This is just the elevator pitch and I'll be working on some product walk through videos shortly. Let me know what web performance techniques, strategies or theory you'd like to see explained in video format. I've been inspired by the charming team at <a href="http://wistia.com/learning">Wistia</a> to create a video learning center for SpeedCurve.</p> Thu, 26 Sep 2013 00:00:00 +1200 Speed Matters talk at Auckland Web Dev Nights https://speedcurve.com/blog/speed-matters-talk-at-auckland-web-dev-nights <p>Here's the slides from my presentation at the <a href="http://www.meetup.com/Auckland-Web-Dev-Nights/">Auckland Web Dev Nights</a> meetup. It's an overview of why front-end performance matter, how to monitor it and the challenges faced when building for an increasingly mobile world.&nbsp;</p> <p> <script class="speakerdeck-embed" src="//speakerdeck.com/assets/embed.js" async="" data-id="9355f4b0f8c90130ea303645efc5dc25" data-ratio="1.77777777777778"></script> </p><h2>Content</h2> <p>Why speed matters, examples of the impact saving a few seconds of load time has had on revenue and engagement. The network constraints and what makes the web slow? Bandwidth, latency and it's fundamental impact on the speed of the web. An overview of tools for measuring performance, uptime monitoring, real user monitoring and performance benchmarking. How to make your website faster. Optimization tools and techniques. Muti-device challenges. Responsive vs Adaptive and delivering to mobile within a second. Drop that donut superman!</p> <h2>Performance Tools</h2> <p>Diagnotic Tools<br /> <a href="http://www.webpagetest.org">WebPagetest</a> and <a href="http://www.youtube.com/watch?v=Z6_7r0faQpI">how to read a browser waterfall</a><br /> <a href="http://developers.google.com/speed/pagespeed/insights/">Google Pagespeed Insights</a><br /> <a href="http://developer.yahoo.com/yslow/">YSlow</a></p> <p>Uptime Monitoring<br /> <a href="http://www.pingdom.com/">Pingdom</a></p> <p>Competitive Benchmarking<br /> <a href="http://speedcurve.com">SpeedCurve</a></p> <p>Real User Monitoring (RUM)<br /> <a href="http://www.pingdom.com/">Pingdom</a><br /> <a href="http://www.newrelic.com">New Relic</a>&nbsp;(also backend, database and server health monitoring)<br /> <a href="https://support.google.com/analytics/answer/1205784?hl=en">Google Analytics</a><br /> <a href="http://www.soasta.com/products/mpulse/">mPulse</a></p> <h2>Performance Checklists</h2> <p><a href="http://stevesouders.com/hpws/rules.php">14 Rules for Faster-Loading Web Sites</a><br /> <a href="http://browserdiet.com/">25 tips on how to lose weight in the browser</a></p> <h2>References</h2> <p><a href="https://github.com/zenorocha/browser-diet/wiki/Impact-of-performance">Impact of performance improvements</a><br /> <a href="http://www.youtube.com/watch?v=YV1nKLWoARQ">Optimizing the Critical Rendering Path for Instant Mobile Websites (Video)</a><br /> <a href="http://www.guypo.com/mobile/what-are-responsive-websites-made-of/">What are responsive websites made of?</a><br /> <a href="http://blog.cloudfour.com/responsive-web-design-is-solid-gold/">Responsive web design is solid gold</a><br /> <a href="http://www.youtube.com/watch?v=bM0yL0eQ9EM">Etsy - Building Resilient User Experiences</a><br /> <a href="http://www.youtube.com/playlist?list=PL055Epbe6d5bdB4KPqssegVpYUDJXSzOp">Velocity Conference Videos</a><br /> <a href="https://github.com/zenorocha/browser-diet/wiki/References">Browser Diet References</a></p> <h2>Credits</h2> <p>These slides are heavily derived and mangled from awesome presentations by <a href="http://andydavies.me/">Andy Davies</a> and <a href="http://www.igvita.com/">Ilya Grigorik</a>. Illustrations by <a href="http://frogpants.bigcartel.com/product/56-geeks-12x18-and-20x30-inch-prints">Scott Johnson</a> via Browser Diet. Feel free to steal it, adapt it and spread the word on front-end web performance.</p> Thu, 05 Sep 2013 00:00:00 +1200 Sort browser waterfalls https://speedcurve.com/blog/sort-browser-waterfalls <p>Sort the items in a browser waterfall by Time, Savings and Slowest. Time is the default showing how assets loaded in the browser. Savings places assets at the top that have the greatest optimization potential and Slowest shows you which are the slowest overall requests. &nbsp;&nbsp;</p> Wed, 14 Aug 2013 00:00:00 +1200 Annotate your graphs https://speedcurve.com/blog/annotate-your-graphs <p>You can now annotate the main graph on SpeedCurve with notes about deployments or specific performance optimizations you may have put live. Just click on the "Annotate" link at the bottom right of the main graph to start adding them and comparing the before and after performance of your website. A vertical line will be placed on the graph where ever a note has been added.</p> <p><img style="width: 100%;" src="https://assets.speedcurve.com/img/blog/annotate.jpg" alt="Annotate web performance graph" /></p> Sun, 21 Jul 2013 00:00:00 +1200 Easily add WebP, SVG and Retina responsive images to your site https://speedcurve.com/blog/easily-add-webp-svg-and-retina-responsive-images-to-your-site <p>A lot of sites are now using responsive design techniques to create great user experiences across mobile, tablet and desktop. Unfortunately images are often just set to 100% width with the same large image being delivered to all browsers and platforms. Picturefill was an important step in delivering responsive images and David Newton's fork now extends that approach to include WebP and SVG images in the mix you send down the pipe.</p><h2>Picturefill</h2> <p><a href="https://github.com/scottjehl/picturefill" target="_blank">Picturefill</a> is a fantastic browser polyfill by Scott&nbsp;Jehl that mimics the proposed picture element allowing you to deliver responsive images to users. It gives you control over what image is loaded and displayed at each browser width using conditional loading based on media queries. You can then curate each user's&nbsp;experience optimizing for screen proportions and assumed&nbsp;bandwidth. You could send smaller images with different aspect ratios to mobile users while desktop users with HiDPI Retina screens might get images twice as large as normal.</p> <h2>Now with file types</h2> <p><a href="http://davidnewton.ca/responsive-images-picturefill-type-attribute" target="_blank">David Newton</a> has forked <a href="https://github.com/nwtn/picturefill" target="_blank">Picturefill</a> adding detection for WebP and SVG, allowing you to combine the switching of sizes and formats into one easy to implement HTML structure.</p> <h2>30% smaller images with WebP</h2> <p>With WebP detection now in place it's easy to send this new image format to browsers that support it and save <a href="https://developers.google.com/speed/webp/docs/webp_study" target="_blank">24%-34%</a> in file size.&nbsp;WebP is a new image format from Google that provides lossless and lossy compression for images.&nbsp;The Chrome Web Store recently switched to WebP images and is&nbsp;<a href="http://blog.chromium.org/2013/02/using-webp-to-improve-speed.html" target="_blank">saving terabytes of bandwidth a day.</a></p> <p>If you're looking to experiment with WebP, <a href="http://www.xnview.com/en/xnconvert/" target="_blank">XnConvert</a> is an easy to use cross platform batch processing tool that supports WebP or grab the <a href="https://developers.google.com/speed/webp/download" target="_blank">latest package</a> from Google.</p> <p>I've added WebP to the SpeedCurve homepage and now people using Chrome and Opera actually get images <strong>56%</strong> smaller.</p> <p>For more on detail on the WebP format, development status and various implementation options check out the video below and Ilya Grigorik's great <a href="http://www.igvita.com/2013/03/07/faster-smaller-and-more-beautiful-web-with-webp/" target="_blank">overview of WebP.</a></p> <p><iframe src="https://www.youtube.com/embed/4tu2SJfSalA?rel=0" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> Sun, 07 Jul 2013 00:00:00 +1200 How SpeedCurve fits into your web performance toolkit https://speedcurve.com/blog/how-speedcurve-fits-into-your-web-performance-toolkit <p>Over the last few years the web performance monitoring toolset has expanded dramatically with the introduction of many new services and products. There are two main types of web performance monitoring, uptime monitoring and real user monitoring. SpeedCurve focuses on a third which I like to call web performance benchmarking.</p><h2>Uptime Monitoring</h2> <p>Uptime services like <a href="http://www.pingdom.com/" target="_blank">Pingdom</a> and <a href="http://www.uptimerobot.com/" target="_blank">Uptime Robot</a> ping your website with an HTTP request every couple of minutes to check that it's online and available. These services often check from various geographic locations to keep an eye on network routes to your server and will send you alerts via email and txt if your website is down. Reporting is often simplistic with just the load time of the initial HTML page reported but it's perfect for knowing if your server is up and running. It's often called synthetic testing as tests are run from servers in a data centre and don't accurately represent what speeds an actual user might get.</p> <h2>Real User Monitoring</h2> <p>Real user monitoring (RUM) sends performance data directly from a user's browser to a cloud service like <a href="http://newrelic.com/" target="_blank">New Relic</a> or <a href="http://www.google.com/analytics/" target="_blank">Google Analytics</a> that aggregates and reports on millions of combined measurements. RUM provides the most realistic picture of what users are actually experiencing in their browsers across different platforms and countries. Google Analytics recently updated their Site Speed report, allowing you to measure up to 10,000 page loads a day with a simple change to the <a href="https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingTiming#sampleRate" target="_blank">sample rate</a> in your tracking code. RUM code must be added to the pages you want to track so you can only get detailed performance insights for your own website.</p> <p><img src="https://assets.speedcurve.com/img/blog/newrelic.jpg" alt="New Relic" width="100%" /></p> <p>Real user monitoring dashboard on New Relic.</p> <h2>Web Performance Benchmarking</h2> <p>SpeedCurve is neither an uptime or real user monitoring service. We focus on bringing two important benchmarking techniques together in a way that no other product does.</p> <p>Firstly we provide detailed analysis of the build of your website over time. We dive right down into the detail of each request a page makes and demonstrate how your front-end code is effecting the performance of your site. Our analysis is based on the industry leading open source project <a href="http://www.webpagetest.org/" target="_blank">Webpagetest.</a> Importantly we do this analysis every 24 hours which allows you to monitor changes to your front-end code base over time, catching any regression issues and monitoring the ongoing effects of any performance optimization changes.</p> <p>Secondly we benchmark your website against two of your competitors or category leaders. We do this by monitoring 3 pages on each site so you get a robust across-site comparison rather than just individual pages. It's not just your homepage that needs to be fast. This benchmarking provides you with the relative performance of each website and allows you to see what a competitor might be doing differently to make their site faster than yours. Are they making less requests than you? Are their images more optimised and grouped into sprite sheets making them a full 2 seconds faster to load? SpeedCurve will tell you.</p> <p>Web performance benchmarking helps you focus on performance problems with your website build and compares you directly with your competitors to ensure you're keeping your users happy with a smokingly fast website.</p> <h2>Recommended Web Performance Toolset</h2> <p>It's vital you combine a real user monitoring tool with the build detail and competitive benchmarking that SpeedCurve provides. This way you get the best of both worlds with robust high level performance metrics from actual users and detailed build analysis and benchmarking from SpeedCurve.</p> <p>Our favourite RUM tool is <a href="http://newrelic.com/" target="_blank">New Relic</a> which gives you great insight across your stack from server health, uptime and backend right through to real user monitoring. It does require an agent to be installed on each server, so won't work for shared hosting. In that case use Google Analytics or Pingdom.</p> <p>Combine New Relic with SpeedCurve and you've got a very detailed picture of performance across your entire backend stack, the front-end of your site and your competitors.</p> Wed, 03 Jul 2013 00:00:00 +1200 Filter graphs by browser events https://speedcurve.com/blog/ <p>It's important to not obsess over the full load time of your website. The point at which a user can see content and interact with your site is arguably more important. To help keep a focus on this you can now filter the main graph by the different browser events like "start render" and "DOM complete".</p> Sat, 22 Jun 2013 00:00:00 +1200 SpeedCurve launches at Velocity Conf https://speedcurve.com/blog/speedcurve-launches-at-velocity-conf <p>SpeedCurve is now in beta. Sign up, check it out and then <a href="http://speedcurve.uservoice.com/forums/193594-general/filters/top">vote for the features</a> you'd like to see.</p><p><iframe src="https://www.youtube.com/embed/JTk26phHGZo?rel=0" width="560" height="315" frameborder="0" allowfullscreen=""></iframe></p> <p>A huge thanks <a href="http://stevesouders.com/">Steve Souders</a> for encouraging me to build SpeedCurve and introducing it at Velocity Conference 2013.&nbsp;</p> Wed, 19 Jun 2013 00:00:00 +1200