FREE THOUGHT · FREE SOFTWARE · FREE WORLD

Home » Google »  Top 3 Speed Tips for Sites using Google Analytics

Top 3 Speed Tips for Sites using Google Analytics

by Charles Torvalds 10 comments

[hide]

I've written alot about how I speed up websites, but there is much more to cover. Here are the 3 ways I speed up my site by playing with the Google Analytics Tracking Code.

  1. Host the Google-Analytics ga.js file locally
  2. Set Correct Cookie Domain
  3. Make Sure Google Analytics Loads

Default Google-Analytics Tracking Code

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-2452345-5");
pageTracker._trackPageview();
</script>

1. Hosting the Google ga.js file locally

Instead of calling the http://www.google-analytics.com/ga.js file in your site's html, you can instead save the ga.js source code and serve it from on your own server! This reduces DNS lookups, gives you control over caching, and if you combine the ga.js with a javascript file already on your site like I do, you reduce HTTP Requests, reduce browser cache lookups, etc.

For this site, I added the ga.js code to my http://static.askapache.com/z/j/apache-999.js file, then I compressed it online and saved to serve!

How to Do it: Serve External Javascript Files locally for Increased Speed


2. Set Correct Domain for Cookie

For those websites who employ multiple sub-domains to serve static content, and you are using the default google-analytics javascript code for website statistics, you may be able to get some speed by forcing the google analytics cookie to only be sent for your non-static subdomain.

I just noticed this on my site the other day while watching the wire:

The Google Analytics cookie was being set for the domain .askapache.com and so it was being sent needlessly with every request to every subdomain, when it only should be sent for requests to www.askapache.com.

Specify Google-Analytics Cookie Domain

So I googled for an answer for awhile and finally found the solution in the ga.js code itself. There is a command called _setDomainName that lets you set the domain for the cookie. The following code sets the GA cookie for .www.askapache.com, ensuring that the cookie will not be sent needlessly for images and other static content.

var pageTracker = _gat._getTracker("UA-732153-7");
pageTracker._setDomainName("www.askapache.com");
pageTracker._trackPageview();

3. Make Sure Google Analytics Loads

Look at the source code for this page to see how I do it. Here is what is going on:

  1. Add the google javascript at the bottom of my source code to make sure the HTML and DOM is fully loaded before first calling the script for download.
  2. Check that the google-javascript is loaded by testing that the object called _gat exists, which is the internal object created.
  3. Initiate google-analytics

The Safer Google-Analytics Include Code

<script type="text/javascript">
if (typeof(_gat) == "object") {
  var pageTracker = _gat._getTracker("UA-732153-7");
  pageTracker._setDomainName("www.askapache.com");
  pageTracker._initData();
  pageTracker._trackPageview();
}
</script>

October 17th, 2008

Comments Welcome

  • http://rickbeckman.org/ Rick Beckman

    Excellent tips, though what happens if Google updates the Analytics code? Is there an easy, low-overhead way of ensuring you're always hosting the most up-to-date code?

  • http://www.lgr.ca/blog/ LGR

    Interesting idea. Do you have any stats on how much faster the page loads are by doing this?

  • http://www.deafness-and-hearingaids.net/ Steve

    Moving external javascript locally is a great idea - thanks for the tip. You only mention Analytics here, do you know if moving or modifying the JS for Adsense violates the terns and conditions?

  • http://www.gatellier.be/blog/ Marin

    Nice tips here. I got some questions remarks:

    #1 apparently it's not strictly forbidden (but not recommanded) to host our own version of ga.js cf: http://www.google.com/support/analytics/bin/answer.py?hl=en&answer=55466

    #2 I tried to set the domainName to my domain ("www.domain.com") but I received 2 sets of cookies:
    _umtz with domain:".www.domain.com"
    AND _umtz with domain: ".domain.com"
    in that order (+ other _umt..)
    Can anyone confirm? is this a bug or something else? on FF3 latest

    #3 I would, on top of this, style the DOM container of the ad so that it will have the correct width+height and the whole DOM will not be rerendered when the ad is loaded

  • Phaoloo

    Great thought about move the script locally. Some pages I visit just waiting for the response from Google site. Although it is just sometimes, but move it locally is great.

  • cherouvim

    @Marin:

    Setting _setDomainName("none") sets all cookies to www.example.com

  • Antonio

    Not a bad concept but considering 6 out of ten websites out ther uses GA and given that GA script already sets the appropriate caching wouldn't a user's browser uses the cached version of GA script by default and as a result that would already have reduced http request and DNS lookup anyways when someone goes to your site?

    And if you were to combine the GA script with your own script in one file (considering if you have do that manually), when Google updates the script, that means you have to update your own script as well. It might be a maintenance nightmare if you have to combine and minify GA script every now and then.

  • Simosito

    Isn't using defer="defer" in the script tag the same as putting it on the bottom of the page?

  • George Garchagudashvili

    this is very important tip for optimization, thanks

  • Christoffer

    Concerning "The Safer Google-Analytics Include Code", how exactly do you do that?

    Your code is just an if-syntax that checks that typeof(_gat) is an object - but what if it isn't? You don't actually perform any steps ensure _gat is loaded, you just don't execute it's functions if it isn't.

    Correct?

    I am thinking of two options.

    1) Either use jquery.ready to perform the _gat functions

    2) Do a setTimeout-loop that waits until _gat is good to go:

    checkLoad();
     
    function checkLoad()
    {
    if (typeof(_gat) == "object") {
    // perform _gat functions
    } else {
    setTimeout('checkLoad();', 100)
    }
    }
     
    checkLoad();

    Comments on my comments? What do you guys think is better?

My Online Tools

Related Articles
Twitter


My Picks
Newest Posts

WordPress Development
Hacking and Hackers

The use of "hacker" to mean "security breaker" is a confusion on the part of the mass media. We hackers refuse to recognize that meaning, and continue using the word to mean someone who loves to program, someone who enjoys playful cleverness, or the combination of the two. See my article, On Hacking.
-- Richard M. Stallman






It's very simple - you read the protocol and write the code. -Bill Joy

Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 3.0 License, just credit with a link.
This site is not supported or endorsed by The Apache Software Foundation (ASF). All software and documentation produced by The ASF is licensed. "Apache" is a trademark of The ASF. NCSA HTTPd.
UNIX ® is a registered Trademark of The Open Group. POSIX ® is a registered Trademark of The IEEE.

Site Map | Contact Webmaster | License and Disclaimer | Terms of Service

↑ TOPMain