While Plone performance on the server is in the process of being improved, I'd like to comment a little bit on its front end performance.
Of course you can make any site serve content a lot faster using a caching proxy like Squid or Varnish, but how can you improve performace at the front end?
Yahoo! Developer Network has collected a set of best practices for high performance web sites, based on the work performed by their Exceptional Performance Group, which helped Yahoo! sites achieve a 25% to 50% reduction in end user response times.
Their idea is optimizing the front end performance first, because something like 80% of the total response time for a web page is spent there. Here are the practices they propose:
- Make Fewer HTTP Requests
- Use a Content Delivery Network
- Add an Expires Header
- Gzip Components
- Put Stylesheets at the Top
- Put Scripts at the Bottom
- Avoid CSS Expressions
- Make JavaScript and CSS External
- Reduce DNS Lookups
- Minify JavaScript
- Avoid Redirects
- Remove Duplicate Scripts
- Configure ETags
Aside from documenting this, they have created a pretty nice plugin for firebug (yes, a plugin for a plugin), called yslow, which measures how well a web site implements their suggested best practices.
So, how do Plone sites score out of the box on this tests? Well, you be the judge. Here are the scores for a freshly installed Plone 2.5.4 site:
Total Score: D (63 points)
Make fewer HTTP requests: F
Use a Content Delivery Network: F
Add an expires header: F
Gzip components: C
Put CSS at the top: A
Put JS at the bottom: A
Avoid CSS expressions: A
Make JS and CSS external: N/A
Reduce DNS lookups: A
Minify JS: A
Avoid redirects: A
Remove duplicate scripts: A
Configure ETags: A
Plone 3.0.2 scores a bit better, because it uses sprites for the toolbar and also fewer icons:
Total Score: C (71 points)
Make fewer HTTP requests: A
Use a Content Delivery Network: F
Add an expires header: F
Gzip components: C
Put CSS at the top: A
Put JS at the bottom: A
Avoid CSS expressions: A
Make JS and CSS external: N/A
Reduce DNS lookups: A
Minify JS: A
Avoid redirects: A
Remove duplicate scripts: A
Configure ETags: A
Now, I find that best practice number two, which encourages the utilization of a Content Delivery Network, like Akamai, to be very unrealistic for most sites. We use it at cnnexpansion.com and it's very expensive, so not many Plone projects would really need or be able to afford this.
Taking that out of consideration, the Plone 2.5.4 score goes up to a C (73 points), while a new Plone 3.0.2 site scores a respectable B (81 points). Which means an out of the box install for Plone 3.0.2 is quite ready for high performance on the front end.
But it gets better. Just download and install the CacheFu product from the Plone web site, fiddle a little bit with the expires headers and you can take Plone 2.5.4 close to 90 points and Plone 3.0.2 close to 100 points in a matter of minutes.
Keep in mind that Plone is very usable out of the box, so you can have a great performing front end easily if you use it. Of course, it's also fairly easy to ignore some of these rules and end up with a D site performance, but that would not be Plone's fault, would it?
Read: Plone high performance sites