How to improve pages with a lot of pictures

Friday 01 October 2010 5:22:17 am

By : Maxime Thomas

A feedback on a particular time consuming issue : when you have a page with a lot of images, small or larges, it can take some time to load the whole page.

For one of our customers, we deal with an optimization issue directly linked to the number of content set in eZPublish.

The feature was to show a category with thumbnails of products just beside.

In content meaning, we have the following :

  • Summary [Folder]
    • Category 1 [Folder]
      • Product 1 [Article]
      • Product 2 [Article]
      • Product 3 [Article]
      • ...
    • ...

At the beginning it was fine, we just have some product and 3 three categories but now, we are dealing with ten categories and almost 40 products. So, for the summary folder, we have large amount of content data fetched and shown.

Using classic cache mecanism as SmartCache did the trick for the compilation but we still had a problem : two many small images were loaded on the same page and it increased the number of HTTP calls. So for one basically called page, it generates around 200 HTTP calls !

This could be detected using Firebug (Network tab) or Pagespeed (Pagespeed Activity tab).

The analysis was quite simple : we have to avoid to load every images at the page load.

So we follow differents tracks :

  • Put all the pictures on the same image and use the Sprite trick : can be done but needs a specific mecanism (how to regenerate the image if one of the product picture is updated ?). The cleaner but needs some deep development.
  • Ajax : slice the HTML by categories and load the HTML / JSON data categories by categories. We had to develop the eZPublish module in order to do that. So we did not choose it.
  • Jquery addon to lazily load pictures : avoid loading the pictures until the page HTML is totaly loaded and triger the HTTP calls on user event, like scrolling. Sounds simple and more efficient.

We finally chose to implement solution number 2, based on the lazy load plugin for jquery.

Some numbers :

  • Initially :
    • Without cache : 40s to fully load the page
    • With cache : 30s to fully load the page
  • With the jquery solution :
    • Without cache : 10s to fully load the page
    • With cache : 2s to fully load the page

Gain : 20x on this optimization. Thank's to Jonas Levaillant for his help on this issue.

More on my blog : http://www.wascou.org/eng/Company/Blog

Powered by eZ Publish™ CMS Open Source Web Content Management. Copyright © 1999-2014 eZ Systems AS (except where otherwise noted). All rights reserved.

eZ debug

Timing: Jan 18 2025 02:01:25
Script start
Timing: Jan 18 2025 02:01:25
Module start 'layout'
Timing: Jan 18 2025 02:01:25
Module start 'content'
Timing: Jan 18 2025 02:01:25
Module end 'content'
Timing: Jan 18 2025 02:01:25
Script end

Main resources:

Total runtime0.1334 sec
Peak memory usage6,144.0000 KB
Database Queries43

Timing points:

CheckpointStart (sec)Duration (sec)Memory at start (KB)Memory used (KB)
Script start 0.00000.0059 592.1641152.6406
Module start 'layout' 0.00590.0035 744.804739.4844
Module start 'content' 0.00940.1219 784.2891380.6563
Module end 'content' 0.13130.0020 1,164.945315.7031
Script end 0.1333  1,180.6484 

Time accumulators:

 Accumulator Duration (sec) Duration (%) Count Average (sec)
Ini load
Load cache0.00352.6544150.0002
Check MTime0.00171.2936150.0001
Mysql Total
Database connection0.00080.569210.0008
Mysqli_queries0.060245.1430430.0014
Looping result0.00050.3810410.0000
Template Total0.093970.420.0470
Template load0.00231.746420.0012
Template processing0.091668.670520.0458
Template load and register function0.00010.103510.0001
states
state_id_array0.00110.816610.0011
state_identifier_array0.00161.192420.0008
Override
Cache load0.00201.4858490.0000
Sytem overhead
Fetch class attribute name0.00231.754030.0008
class_abstraction
Instantiating content class attribute0.00000.006130.0000
General
dbfile0.00130.9634100.0001
String conversion0.00000.007340.0000
Note: percentages do not add up to 100% because some accumulators overlap

Templates used to render the page:

UsageRequested templateTemplateTemplate loadedEditOverride
1node/view/full.tplblog_entry/full.tplextension/community_design/design/suncana/override/templates/blog_entry/full.tplEdit templateOverride template
2content/datatype/view/ezxmltext.tpl<No override>extension/community_design/design/suncana/templates/content/datatype/view/ezxmltext.tplEdit templateOverride template
8content/datatype/view/ezxmltags/paragraph.tpl<No override>extension/ezwebin/design/ezwebin/templates/content/datatype/view/ezxmltags/paragraph.tplEdit templateOverride template
9content/datatype/view/ezxmltags/li.tpl<No override>design/standard/templates/content/datatype/view/ezxmltags/li.tplEdit templateOverride template
9content/datatype/view/ezxmltags/ul.tpl<No override>design/standard/templates/content/datatype/view/ezxmltags/ul.tplEdit templateOverride template
5content/datatype/view/ezxmltags/link.tpl<No override>design/standard/templates/content/datatype/view/ezxmltags/link.tplEdit templateOverride template
1content/datatype/view/ezkeyword.tpl<No override>extension/community_design/design/suncana/templates/content/datatype/view/ezkeyword.tplEdit templateOverride template
1print_pagelayout.tpl<No override>extension/community/design/community/templates/print_pagelayout.tplEdit templateOverride template
 Number of times templates used: 36
 Number of unique templates used: 8

Time used to render debug report: 0.0002 secs