5 min. reading

How to Improve Website Page Speed with Google TestMySite (from 10s to 3s!)

Based on Google TestMySite data the top performing websites load in under 3 seconds, so we set ourselves on a mission to achieve just that for our own website.

0 comments

Website load speed greatly impacts your website search rankings, bounce rates and overall user experience. Google’s tool called “Think with Google Test My Site” simply crawls your site with a slow 3G mobile browser and checks how fast the site loads and gives some generic improvement suggestions. We followed their guidelines and some other best practices to reduce load times. Here is what we discovered.

6 ways making your site to load faster with ThinkWithGoogle speed test

Test my site with Google result

According to Google, we started of with 10s loading time and a 29% estimated visitor loss when we first ran the test! Not so sure about the estimated loss, but 10s is a long period of time for the site to load - let me tell you that. It definitely needed some optimization, so here’s what we did.

First, we made sure all items listed on Google’s PageSpeed Insights were addressed:

#1 Optimize images

Let’s start with the easiest – Google suggests to optimize the images. The easiest way to do it is by using free online tools, including Compressor.io, TinyPNG, and ImageOptim.

It’s also very important to resize the images to the dimensions used on the website. For example, if you are using 200x200px images on your pages, the images should be sized on your server this way. There are tons of free online tools to resize the images, like the following: ResizeImage. When you run the PageSpeed Insights tool, it optimizes your images and allows you to download them. However, optimizing them with the first tools described brings better results.

Lazy loading images

If your web page is very image heavy, consider "lazyloading" the images. Lazyload means that only those images that are in a viewport will be loaded. So, when the page loads, your browser only downloads the current images on the page, and continues to load more as the user scrolls down the page.

It helps to save bandwidth and reduce page loading time which allows for a quicker above-the-fold content render.

However, it has a downfall as you scroll to the next image. The image usually needs time to be downloaded and rendered to the browser, so for a couple of milliseconds or seconds (depends on internet connection speed) the block which should contain image is seen as blank or broken.

Image loading animation transition

To avoid that, we use a loader animation and hide it with a nice fade transition when the image is ready to be seen.

We use this plugin for lazy loading.

#2 Minify HTML, CSS and JS

The next step is to minify HTML, CSS and JS files. This can be done using Gulp while the site is still in development mode, or you can recompile it. Alternatively, you can download optimized CSS, HTML and JS files for Google PageSpeed Insights tool. If you are using one of most popular content management systems, you can use a plugin:

#3 Leverage Browser Caching

The third step is a bit more challenging. It’s called “Leverage Browser Caching,” and it has more than one way to be dealt with.

  1. If you don’t want to spend extra money on a hosting upgrade, one of the most cost-effective ways to leverage browser caching is to add a few lines to your .htaccess file (we are assuming you are on Linux server running Apache)

     
    # Setting expire dates for cache
    <ifModule mod_expires.c>
      ExpiresActive On
      ExpiresDefault "access plus 1 seconds"
      ExpiresByType image/x-icon "access plus 2592000 seconds"
      ExpiresByType image/jpeg "access plus 2592000 seconds"
      ExpiresByType image/png "access plus 2592000 seconds"
      ExpiresByType image/gif "access plus 2592000 seconds"
      ExpiresByType image/svg "access plus 2592000 seconds"
      ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
      ExpiresByType text/css "access plus 2592000 seconds"
      ExpiresByType text/javascript "access plus 216000 seconds"
      ExpiresByType application/javascript "access plus 216000 seconds"
      ExpiresByType application/x-javascript "access plus 216000 seconds"
      ExpiresByType text/html "access plus 600 seconds"
      ExpiresByType application/xhtml+xml "access plus 600 seconds"
      ExpiresByType application/x-font-ttf "access plus 1 year"
      ExpiresByType application/x-font-opentype "access plus 1 year"
      ExpiresByType application/x-font-woff "access plus 1 year"
    </ifModule>
    
    <IfModule mod_headers.c>
      <filesmatch "\.(ico|flv|jpg|jpeg|png|gif|css|swf|svg)$">
        Header set Cache-Control "max-age=2678400, public"
      </filesmatch>
      <filesmatch "\.(html|htm)$">
        Header set Cache-Control "max-age=7200, private, must-revalidate"
      </filesmatch>
      <filesmatch "\.(pdf)$">
        Header set Cache-Control "max-age=86400, public"
      </filesmatch>
      <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=2678400, private"
      </filesmatch>
      <filesmatch "\.(woff)$">
        Header set Cache-Control "max-age=2678400, private"
      </filesmatch>
    </IfModule>
     
  2. If you are using a server with cPanel, it’s a great way to add nginx plugin, because this gives some serious boost while loading static content.
  3. Finally, you can upgrade your hosting with CDN (content delivery network). It’s a great way to improve your website performance but it can be quite expensive in some cases. Here is a great explanation of how it works:

Leverage browser caching for Google Analytics

In some rare cases, these optimizations won’t solve all your problems. For example, third-party scripts, like Google Analytics, can still be listed as an issue of Google's Leverage browser caching. To solve this issue, use the following code snippet instead of a regular one that Google Analytics provides:

 
<script>
  window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
  ga("create", "REPLACE THIS WITH YOUR CODE", "auto");
  ga("send", "pageview");
</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
 

#4 Eliminate render-block resources

I hope you're still enjoying this process. We’re almost finished!

Eliminating render-block resources above the fold can be tricky. If you are using Joomla or WordPress, the plugins mentioned above might do the job, but otherwise you might need to move all JS files from the document head to the end of your document body, then make all unused CSS resources load with a delay, and only keep those necessary to show the first fold content. An alternative solution is to add a loader screen instead of delaying CSS resources. You can find some cool free lightweight loaders here.

#5 Enable Gzip compression

The fifth step is to enable compression.

To enable gzip compression simply add these lines to your .htaccess file:

 
#Gzip
<IfModule mod_deflate.c>
  # Compress HTML, CSS, JavaScript, Text, XML and fonts
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE application/x-font
  AddOutputFilterByType DEFLATE application/x-font-opentype
  AddOutputFilterByType DEFLATE application/x-font-otf
  AddOutputFilterByType DEFLATE application/x-font-truetype
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE font/woff
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE image/x-icon
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml

  # Remove browser bugs (only needed for really old browsers)
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  Header append Vary User-Agent
</IfModule>
# End Gzip

# If mod_deflate doesn’t work on your server you can use mod_gzip
<IfModule mod_gzip.c>
  mod_gzip_on Yes
  mod_gzip_dechunk Yes
  mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
  mod_gzip_item_include handler ^cgi-script$
  mod_gzip_item_include mime ^text/.*
  mod_gzip_item_include mime ^application/x-javascript.*
  mod_gzip_item_exclude mime ^image/.*
  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
 

#6 Enable HTTP Keep-Alive (persistent connection)

Enabling HTTP Keep-Alive or persistent connection allows a single open connection for multiple file requests to your server, which helps to speed up the loading time of your website. Also it saves a lot of bandwidth.

You can enable HTTP Keep-Alive by copying and pasting the following code into your .htaccess file:

 
#Gzip
<IfModule mod_headers.c>
  Header set Connection keep-alive
</IfModule>
 

Read more about how to enable HTTP Keep-Alive on other applications here.

Server and maintenance

We haven’t upgraded the server during this optimization process, but in many instances, that should be the first step.

The Website hosting server is one of the major factors influencing your website loading times. If your website is hosted on a shared hosting (most cheap hosting packages are) - upgrading it to a VPS server would be highly recommended.

High trafficked international websites can greatly benefit from CDN (Content Delivery Network). CDN is based on multiple servers located across the world delivering content to users based on their geolocation. The static files of your website can also be stored in a CDN server to deliver them more quickly and reduce load of your server. The downside, of course, is it’s expensive.

Keeping the website up to date and removing unnecessary plugins also helps maintain performance over time.

Conclusion

Our 3-second load time is an optimal solution that meets Google’s top performing website criteria and also maintains the balance between user experience, server cost and security. More than that, using Google PageSpeed Insights tools, the site gets 88/92 points, which is a great result for a CMS driven website.

It was a good experiment that we repeated with our clients' websites, as website speed optimization is an important part of our website maintenance process.

Helpful? Share it!
Sarunas Budrikas - CEO of Angle180

I'm Sarunas Budrikas, CEO of Angle180, a B2B marketing company delivering results through high performance web design and traffic generation.

You can also find me on LinkedIn and Twitter.