[wp-hackers] Front End Performance in WordPress
John Biddle
john at poolstudent.com
Mon Mar 23 20:27:40 GMT 2009
This is my first post to the list, so if I've done something wrong I
apologize in advance. It's a long one, but I hoe it will spur a great
discussion.
WordPress performance is talked about all the time, but much of the
discussion seems to be on the performance of the back end, while the
bulk of the improvement opportunity is in the front end. Steve Souders
excellent book High Performance Web Sites, published by O'Reilly lists
14 rules that if followed can boost front end performance on websites
substantially. Most do not require any significant or complex efforts.
However, most are difficult to impossible for a technically proficient,
let alone an average blogger, to implement in WordPress.
I used Steve's rules to optimize my site before I went to WordPress and
they worked extremely well. My site performed spectacularly. Once I
moved to WP, the speed dropped greatly. WP is doing more, I'm ok with
some of the slowdown, but most of the performance drag is due to poorly
optimized code from the perspective of the front end.
Much of the improvement potential is in changing the way some things are
done in plugins. I know plugins are written independent of Automattic
and WordPress, but it seems to me that if there were guidelines on how
plugins could be written to maximize performance, and if WP had a
structure supporting same, that plugin developers would do it
voluntarily, sine they believe in WP and genuinely want the best end
result for the end user.
I don't claim to be a great developer, and I am relatively new to
WordPress, but I think these will at least make the ideas clear.
Implementation I gladly leave to much more capable hands. The numbers
refer to the rules in Steve Souders book High Performance Web Sites.
*#1) Make Fewer HTTP requests: *More than a few WP plugins have
multiple Javascript files. Best practice would be to combine these into
one. Average round trip to the server is between 0.1 and 0.2 seconds,
so picking up a few begins to make a difference.
Combining JS files from multiple plugins and core WP would save
additional round trips, but becomes more difficult to manage. People
will have different opinions on the tradeoff between ease of management
and performance. I'm not suggesting that performance always wins, I'm
just saying that there is a lot of performance improvement potential to
be mined here and in the other rules that clever development might turn
into gold.
Another place to save is in plugin-specific CSS files. A large number
of plugins have these, some more than one. Combining these into
STYLE.CSS in the theme saves more round trips. This one is more
problematic, since as a plugin is improved, additional lines added to
the plugin specific css file would need to be added to STYLE.CSS. I
think this is manageable, since it probably doesn't happen often.
If a plugin is deactivated, the plugin specific css code in STYLE.CSS
should be purged. I suppose this could be automated is all plugin
specific css code began and ended with unique values, but this is
probably too much trouble. Bloggers could run a plugin for a little
while and decide if they like it, use the current behavior, then switch
to high performance behavior if they choose to keep the plugin active.
When a theme is replaced for a new on, the changes would have to be
redone, but with the right process this should be automatic.
Social Bookmark plugins and others with multiple small graphics should
be strongly encouraged to use sprites for said graphics. Every one is
another round trip, even when in the cache (more later).
*#2) Use a Content Delivery Network: *This doesn't have to be a paid
service type CDN to get the benefit, just a subdomain, free to most
bloggers.
If WP had a standard way for a blogger to store his/her CDN subdomain
(and optionally directory, one for each plugin) then if the blogger
checked a box in the setup of a plugin, that plugin would know to use
install and use the copy of static files in the CDN. The plugin
developer would be in charge of determining which files were static.
*#3) Add an Expires Header: *By doing this, the round trip to the
server to determine if the file in cache is current is eliminated. It
greatly enhances the value of having things in the cache. Especially in
a blog, where so many things are the same from page to page, this
savings can be quite significant. By providing a standardized .htaccess
file for bloggers on an Apache server (and other comparable
documentation for other common servers that support this), WP greatly
improves the value of the pseudo CDM described above, since the files in
it will be those that aren't changing. Since plugin developers are in
control of what goes into the pseudo CDN (if the blogger has chosen to
use one) they are in a position to introduce a new version of a file
they though wouldn't change by issuing it with a new name. WP could
suggest a standard approach to this, like using a version number or a
date at the end of the filename.
*#4) Gzip Components: *WP already supports Gzip, great. However, by
providing a structure and standard mechanism, more files could be
Gzipped for those choosing to do so. JS and CSS files fall into this
category, again, optional.
*#5) Put Style sheets at the Top:* This is already enhanced by the work
in #1 to combine CSS files into STYLE.CSS.
*#6 Put Scripts at the Bottom: *Some scripts do this now, but if WP
encouraged the community to offer this as an option, more would do so,
and many bloggers would take them up on it, and gain performance because
of it. Sometimes this doesn't work, and moving the Javascript up can't
be helped, but all plugins shouldn't avoid this because a few would have
problems.
*#7 Avoid CSS Expressions: NA*
*#8 Make Javascript and CSS External: *This is already done by most,
but it certainly wouldn't hurt to make a point of how much t helps.
*#9 Reduce DNS Lookups: *Some plugins rely on JS code from 3^rd
parties, like Google, and go get that code repeatedly from those sites.
I suggest making it optional for the blogger to choose to keep that 3^rd
party code on his/her own server. This avoids DNS lookups and may
improve download performance as well. The JS file for Google Analytics
is a case in point. JS libraries are another.
*#10) Minify Javascript: *Plugin developers should be strongly
encouraged to minify their JS files. They are in the best position to
verify that they work after processing. WordPress could help by either
recommending a preferred product to use or even making it easier and
providing it. Many do this but all should. Some still won't but so what.
*#11) Avoid Redirects: NA*
*#12) Remove Duplicate Scripts: * This is partially solved by
implementing #3, and can be enhanced further through the use of script
management. See Souder's book, High Performance Web Sites, page 87.
*#13) Configure ETags: *I confess I don't really understand this one.
*#14) Make Ajax Cacheable: *Probably not relevant at this time.
John Biddle
--
*Pool Student's Blog <http://www.poolstudent.com/>*
More information about the wp-hackers
mailing list