Blogs / Maxime Thomas / How to improve pages with a lot of pictures

How to improve pages with a lot of pictures

Friday 01 October 2010 5:22:17 am

  • Currently 4 out of 5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

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

eZ debug

Timing: Jan 17 2025 23:50:02
Script start
Timing: Jan 17 2025 23:50:02
Module start 'content'
Timing: Jan 17 2025 23:50:02
Module end 'content'
Timing: Jan 17 2025 23:50:02
Script end

Main resources:

Total runtime0.2466 sec
Peak memory usage2,048.0000 KB
Database Queries141

Timing points:

CheckpointStart (sec)Duration (sec)Memory at start (KB)Memory used (KB)
Script start 0.00000.0072 587.8438180.8203
Module start 'content' 0.00720.0057 768.664199.1719
Module end 'content' 0.01290.2336 867.8359531.9609
Script end 0.2465  1,399.7969 

Time accumulators:

 Accumulator Duration (sec) Duration (%) Count Average (sec)
Ini load
Load cache0.00351.4346200.0002
Check MTime0.00140.5674200.0001
Mysql Total
Database connection0.00150.619610.0015
Mysqli_queries0.198380.43201410.0014
Looping result0.00140.57121390.0000
Template Total0.233394.610.2333
Template load0.00090.375110.0009
Template processing0.232394.218510.2323
Override
Cache load0.00060.261110.0006
Sytem overhead
Fetch class attribute can translate value0.00080.328010.0008
XML
Image XML parsing0.00020.098110.0002
General
dbfile0.00170.7030200.0001
String conversion0.00000.002930.0000
Note: percentages do not add up to 100% because some accumulators overlap

CSS/JS files loaded with "ezjscPacker" during request:

CacheTypePacklevelSourceFiles
CSS0extension/community/design/community/stylesheets/ext/jquery.autocomplete.css
extension/community_design/design/suncana/stylesheets/scrollbars.css
extension/community_design/design/suncana/stylesheets/tabs.css
extension/community_design/design/suncana/stylesheets/roadmap.css
extension/community_design/design/suncana/stylesheets/content.css
extension/community_design/design/suncana/stylesheets/star-rating.css
extension/community_design/design/suncana/stylesheets/syntax_and_custom_tags.css
extension/community_design/design/suncana/stylesheets/buttons.css
extension/community_design/design/suncana/stylesheets/tweetbox.css
extension/community_design/design/suncana/stylesheets/jquery.fancybox-1.3.4.css
extension/bcsmoothgallery/design/standard/stylesheets/magnific-popup.css
extension/sevenx/design/simple/stylesheets/star_rating.css
extension/sevenx/design/simple/stylesheets/libs/fontawesome/css/all.min.css
extension/sevenx/design/simple/stylesheets/main.v02.css
extension/sevenx/design/simple/stylesheets/main.v02.res.css
JS0extension/ezjscore/design/standard/lib/yui/3.17.2/build/yui/yui-min.js
extension/ezjscore/design/standard/javascript/jquery-3.7.0.min.js
extension/community_design/design/suncana/javascript/jquery.ui.core.min.js
extension/community_design/design/suncana/javascript/jquery.ui.widget.min.js
extension/community_design/design/suncana/javascript/jquery.easing.1.3.js
extension/community_design/design/suncana/javascript/jquery.ui.tabs.js
extension/community_design/design/suncana/javascript/jquery.hoverIntent.min.js
extension/community_design/design/suncana/javascript/jquery.popmenu.js
extension/community_design/design/suncana/javascript/jScrollPane.js
extension/community_design/design/suncana/javascript/jquery.mousewheel.js
extension/community_design/design/suncana/javascript/jquery.cycle.all.js
extension/sevenx/design/simple/javascript/jquery.scrollTo.js
extension/community_design/design/suncana/javascript/jquery.cookie.js
extension/community_design/design/suncana/javascript/ezstarrating_jquery.js
extension/community_design/design/suncana/javascript/jquery.initboxes.js
extension/community_design/design/suncana/javascript/app.js
extension/community_design/design/suncana/javascript/twitterwidget.js
extension/community_design/design/suncana/javascript/community.js
extension/community_design/design/suncana/javascript/roadmap.js
extension/community_design/design/suncana/javascript/ez.js
extension/community_design/design/suncana/javascript/ezshareevents.js
extension/sevenx/design/simple/javascript/main.js

Templates used to render the page:

UsageRequested templateTemplateTemplate loadedEditOverride
1pagelayout.tpl<No override>extension/sevenx/design/simple/templates/pagelayout.tplEdit templateOverride template
 Number of times templates used: 1
 Number of unique templates used: 1

Time used to render debug report: 0.0002 secs