Things that will make your website much faster

What will make my website faster? How to optimize page load time? How to make web site appear to load faster for end user?

Updated Feb 9, 2011.

This is excerpt from article: How big HTML images / CSS / JS / png / etc. should be to fit network packet (MTU) efficiently

List of things that will make your website much faster:

  • Server must support Keep-Alive. Otherwise change server / host / hosting company / etc. Do it NOW!
  • Reduce HTTP requests (CSS sprites, combine CSS, combine JS, inline CSS, inline JS)
  • Minifiy HTML, JS, CSS. Google Closure Tools, YUI Compressor, Minification
  • Gzip text/html, css, js (IE6 does not un-gzip CSS and JS, if reference is not from HEAD)
  • For IE 5 & 6 use gzip-only-text/html
  • Check if (Content-Encoding: gzip) then (Vary: Accept-Encoding) to allow cache both versions in proxy servers
  • CSS goes in head, JS goes at bottom – right before body closing tag
  • Defer JS if possible. Defer allows to load js after onload
  • Image formats: for photos – always use JPG, for everything else – PNG 8, for animations – GIF
  • Compress images: for JPG use jpegtran or jpegoptim Adobe Photoshop or Advanced JPEG Compressor (both non-free) or free GIMP, for PNG use OptiPNG or PNGOUT. I use non-free but the best one – PNGOUTWin
  • Think connections! Waterfall. webpagetest.org (probably the best site for web page speed / optimization test), Zoompf (a little overkill, but can be useful), Pingdom Tools
  • Try to serve assets in parallel, e.g, images.example.com, images2.example.com; subdomains can be on the same IP
  • Use 2-3 max 4 sub-domains
  • Optimize response headers, smaller, meaningful
  • Avoid redirects (301, 302, META refresh, document.location)
  • Remove ETAG
  • Use Expires + cache-control
  • 25k and greater files are not cached on iPhone
  • Cache dynamic content PHP, ASPX, ruby etc.
  • example.com?param is not cached by most proxies
  • Serve static assets from cookie-less domain, like yimg.yahoo.com
  • After onload via js can pre-cache images (if you know where visitor will go next)
  • Can use double heads (if a lot of meta then put 2nd head at the bottom after closing BODY tag)
  • Use CDN if can afford

And remember about:

Related tools / links:

More reading and watching:

While making website faster, do not forget about security:

Things that big guys (such as Google, Microsoft, Yahoo, Akamai) do. This requires custom software, customized Linux / BSD / Apache compilation, and of course deep knowledge in networking, OSI model, TCP, etc.:

P.S. This blog (wishmesh.com) is not optimized for anything (speed, size, etc.). People are lazy. They optimize only when there is reason to do it, and we like most humans are lazy, so this blog runs on default WordPress hosted on shared server.

Unable to connect to the Microsoft Visual Studio 2010 Remote Debugging Monitor in service mode

Rarely I need to use Visual Studio Remote Debugger to debug Native application. It always big pain to configure everything correctly. But today I needed to run Remote Debugger as service, so I can debug another service, when no any user is logged onto computer.

First strange thing I noticed, that I am able to run ‘Visual Studio 2010 Remote Debugger’ from start menu and it shows ‘Msvsmon started a new server named username@TESTSRV’. It should not happen because I already have debugger service running. I double checked that under Control Panel – Services.

At that point I thought that it is somehow possible to start multiple debugger services simultaneously using the same name. I tried to run another instance of Visual Studio 2010 Remote Debugger, and of course it failed with error:
Visual Studio Remote Debugging Monitor

An instance of msvsmon is already running on this machine under your user account. If you like to run multiple instances of msvsmon, you must use a different server name. Please enter a new server name.

Server name: [username@TESTSRV]
[OK] [Exit]

So it is not possible to run two servers with the same name and I have the Application and the Service running at the same time. So it must be a different name for the service then, but I can not find a way to get actual Server name for service.

Desperately trying to connect to Debugger service, I begun to play with Attach to process dialog. I always connected to remote machines using username@machine syntax. I tried to connect using machine name, username, IP address, but nothing worked. It sometimes displayed the following error:
---------------------------
Microsoft Visual Studio
---------------------------
Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor named 'username@TESTSRV'. There is no server by the specified name running on the remote computer.
---------------------------
OK Help
---------------------------

Sometimes dialog window just closed without showing anything. And I got it. When it closes without en error there should be connection to remote machine going on, but why does dialog close? Instead of closing I tried to click on ‘Show processes form all users’ and it worked. It also worked if I clicked Refresh. To me it seemed a counter intuitive at that point. But the main pitfall was the Server name.

When you run Remote Debugger as Application the Server name is username@computername:

When you run Remote Debugger as Service the Server name is computername:

Also, note that I am using Workgroup configuration. I do not have a Domain.

Also, under Workgroup I can not run service under LocalSystem account. I am getting Kerberos authentication error:
---------------------------
Microsoft Visual Studio
---------------------------
Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor named 'TESTSRV'. The Visual Studio Remote Debugger on the target computer cannot connect back to this computer. Kerberos authentication failed. Please see Help for assistance.
---------------------------
OK Help
---------------------------

More info: Visual Studio Debugger – Error: Kerberos Authentication Failed

So I am running service under administrator account with firewall disabled. (do not disable firewall if you are not in secure LAN)

I hope my experience with Remote Debugging will help someone to solve similar issues.

Context menu extension to remove all .svn folders

Here is my version of Shell / context menu extension to remove all .svn folders (used by Subversion).

This reg file adds menu item called ‘Delete SVN Folders’ under Right mouse click on folder.

Download and run this file: DeleteSVN.reg

Here is a full source of DeleteSVN.reg:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && echo Confirm to permanently delete all .svn folders. This operation cannot be undone! && pause && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

Tested on Windows Vista and Windows 7.