Performances

161
Performances client

description

Cours sur les performances côté client.

Transcript of Performances

Page 1: Performances

Performances client

Page 2: Performances

Performances client ?

Page 3: Performances

Malgré l’augmentation des débits,le web est lent

Site web Temps de chargement

TF1 5,0s

Allociné 4,0s

Facebook 4,6s

Skyrock 3,7s

Yahoo! France 1,8s

DailyMotion 2,4s

Le Monde 7,9s

Amazon France 3,7s

Page 4: Performances

Depuis 5 ans…

Page 5: Performances

Depuis 5 ans…

• Poids des pages x3

Page 6: Performances

Depuis 5 ans…

• Poids des pages x3

• Nombre de composants x2

Page 7: Performances

Depuis 5 ans…

• Poids des pages x3

• Nombre de composants x2

• Nombre de balises HTML x2

Page 8: Performances

Depuis 5 ans…

• Poids des pages x3

• Nombre de composants x2

• Nombre de balises HTML x2

En moyenne, plus de 300 ko par page… pour seulement 500 mots

Page 9: Performances

Depuis 5 ans…

• Poids des pages x3

• Nombre de composants x2

• Nombre de balises HTML x2

En moyenne, plus de 300 ko par page… pour seulement 500 mots

Source

Page 10: Performances

Est-ce utile ?

Page 11: Performances

Est-ce utile ?

• 500ms = -20% de traffic pour Google

Page 12: Performances

Est-ce utile ?

• 500ms = -20% de traffic pour Google

• 100ms = -1% de ventes pour Amazon

Page 13: Performances

Est-ce utile ?

• 500ms = -20% de traffic pour Google

• 100ms = -1% de ventes pour Amazon

• -30% du poids = +25% d’utilisateurs pour Google Maps

Page 14: Performances

Est-ce utile ?

• 500ms = -20% de traffic pour Google

• 100ms = -1% de ventes pour Amazon

• -30% du poids = +25% d’utilisateurs pour Google Maps

• 400ms = 5 à 9% d'abandons pour Yahoo!

Page 15: Performances

Pourquoi le client ?

Page 16: Performances

Pourquoi le client ?

Page 17: Performances

Pourquoi le client ?

Page 18: Performances

Pourquoi le client ?

Page 19: Performances

Pourquoi le client ?

80 à 90% du chargement géré par le client10 à 20% pour l’applicatif serveur

Page 20: Performances

Un peu de réseau

Page 21: Performances

Le mythe de l’ADSLOffres 8, 20, 28 Mbits

Page 22: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

Page 23: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

Pour 8 Mbits :

Page 24: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

-20% à -25% : 6 Mbits en IPPour 8 Mbits :

Page 25: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

-20% à -25% : 6 Mbits en IP-2% à -3% : 5,8 Mbits en TCP/IP

Pour 8 Mbits :

Page 26: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

-20% à -25% : 6 Mbits en IP-2% à -3% : 5,8 Mbits en TCP/IP

Pour 8 Mbits :

Débit théorique maximal sur une ligne optimale

Page 27: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

-20% à -25% : 6 Mbits en IP-2% à -3% : 5,8 Mbits en TCP/IP

Pour 8 Mbits :

Débit théorique maximal sur une ligne optimaleTV par ADSL : 5Mbits

Page 28: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

-20% à -25% : 6 Mbits en IP-2% à -3% : 5,8 Mbits en TCP/IP

Pour 8 Mbits :

Débit théorique maximal sur une ligne optimaleTV par ADSL : 5Mbits

Il y a encore du RTC en France

Page 29: Performances

Le mythe de l’ADSL(ATM)Offres 8, 20, 28 Mbits

-20% à -25% : 6 Mbits en IP-2% à -3% : 5,8 Mbits en TCP/IP

Pour 8 Mbits :

Débit théorique maximal sur une ligne optimale

3G : 3,6Mbits théorique (~2Mbits en pratique)

TV par ADSL : 5Mbits

Il y a encore du RTC en France

Page 30: Performances

Chargement d’une ressource

Page 31: Performances

Chargement d’une ressource

Navigateur

Page 32: Performances

Chargement d’une ressource

Navigateur

Temps

Page 33: Performances

Chargement d’une ressource

Serveur DNS

Navigateur

Temps

Page 34: Performances

Chargement d’une ressource

Serveur DNS

Navigateur

Temps

Page 35: Performances

Chargement d’une ressource

Serveur DNS

Navigateur

Temps

DNS

Page 36: Performances

Chargement d’une ressource

Serveur DNS

Navigateur

Serveur

Temps

DNS

Page 37: Performances

Chargement d’une ressource

Serveur DNS

Navigateur

Serveur

Temps

DNS

Page 38: Performances

Chargement d’une ressource

Serveur DNS

Navigateur

Serveur

Temps

DNS TCP

Page 39: Performances

HTT

P

Chargement d’une ressource

Serveur DNS

Navigateur

Serveur

Temps

DNS TCP

Page 40: Performances

Réponse HTTP

HTT

P

Chargement d’une ressource

Serveur DNS

Navigateur

Serveur

Temps

DNS TCP

Page 41: Performances

Réponse HTTP

HTT

P

Chargement d’une ressource

Serveur DNS

Navigateur

Serveur

Temps

DNS TCP

x nombrede domaine

Page 42: Performances

Réponse HTTP

HTT

P

Chargement d’une ressource

Serveur DNS

Navigateur

Serveur

Temps

DNS TCP

x nombrede domaine

x nombre de ressource

Page 43: Performances

Évaluer les performances

Page 44: Performances

• YSlow + Firebug

• WebPageTest

Outils

Page 45: Performances

Agir

Page 46: Performances

Chargement d’une page

Page 47: Performances

Chargement d’une page

• HTML

Page 48: Performances

Chargement d’une page

• HTML

• Images

Page 49: Performances

Chargement d’une page

• HTML

• Images

• CSS

Page 50: Performances

Chargement d’une page

• HTML

• Images

• CSS

• Images CSS

Page 51: Performances

Chargement d’une page

• HTML

• Images

• CSS

• Images CSS

• Javascript

Page 52: Performances

Chargement d’une page

• HTML

• Images

• CSS

• Images CSS

• Javascript

• Exécution

Page 53: Performances

Chargement d’une page

• HTML

• Images

• CSS

• Images CSS

• Javascript

• Exécution

• Rendu

Page 54: Performances

Objectifs

Page 55: Performances

Objectifs

• Moins de requête HTTP

Page 56: Performances

Objectifs

• Moins de requête HTTP

• Ressources moins lourdes

Page 57: Performances

Objectifs

• Moins de requête HTTP

• Ressources moins lourdes

• Améliorer le temps de traitement

Page 58: Performances

static.example.org

Page 59: Performances

static.example.org

• Domaine ou sous-domaine dédié aux ressources statiques

Page 60: Performances

static.example.org

• Domaine ou sous-domaine dédié aux ressources statiques

• Paralléliser les téléchargements

Page 61: Performances

static.example.org

• Domaine ou sous-domaine dédié aux ressources statiques

• Paralléliser les téléchargements

• Désactiver les cookies

Page 62: Performances

static.example.org

• Domaine ou sous-domaine dédié aux ressources statiques

• Paralléliser les téléchargements

• Désactiver les cookies

• Entre 2 et 4 domaines/sous-domaines, pas plus

Page 63: Performances

Toutes ressources

Page 64: Performances

Toutes ressources• Expiration

<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 month" ExpiresByType text/css "access plus 2 weeks"</IfModule>

Page 65: Performances

Toutes ressources• Expiration

<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 month" ExpiresByType text/css "access plus 2 weeks"</IfModule>

• ETagETag: "10C24BC-4AB-457E1C1F"

Par défaut : FileETag INode MTime Size

Désactiver : FileETag None

Page 66: Performances

Ressources texte

Page 67: Performances

Ressources texte

• GZip<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/css</IfModule>

Page 68: Performances

HTML

Page 69: Performances

HTML

• Cache serveur

Page 70: Performances

HTML

• Cache serveur

• Réduisez le nombre d’éléments

Page 71: Performances

HTML

• Cache serveur

• Réduisez le nombre d’élémentsdocument.getElementsByTagName('*').length

Page 72: Performances

CSS & Javascript

Page 73: Performances

CSS & Javascript

• CSS : au début

Page 74: Performances

CSS & Javascript

• CSS : au début

• Javascript : à la fin

Page 75: Performances

CSS & Javascript

• CSS : au début

• Javascript : à la fin

Page 76: Performances

CSS & Javascript

• CSS : au début

• Javascript : à la fin

1. Externalisez

Page 77: Performances

CSS & Javascript

• CSS : au début

• Javascript : à la fin

1. Externalisez

2. Combinez

Page 78: Performances

CSS & Javascript

• CSS : au début

• Javascript : à la fin

1. Externalisez

2. Combinez

3. Minimifiez

Page 79: Performances

« Minimification »

Page 80: Performances

« Minimification »

43471 octets 9431 octets

Page 81: Performances

« Minimification »

43471 octets 9431 octets

~ -78%

Page 82: Performances

GZip

43471 octets 12920 octets

Page 83: Performances

GZip

43471 octets 12920 octets

~ -70%

Page 84: Performances

« Minimification » + GZip

43471 octets 3867 octets

Page 85: Performances

« Minimification » + GZip

43471 octets 3867 octets

~ -91%

Page 86: Performances

Javascript

Page 87: Performances

Javascript• N’utilisez pas de packer

Page 88: Performances

Javascript• N’utilisez pas de packer

• Évitez les fichiers dupliqués

Page 89: Performances

Javascript• N’utilisez pas de packer

• Évitez les fichiers dupliqués

• Utilisez intelligemment les événements

Page 90: Performances

Javascript• N’utilisez pas de packer

• Évitez les fichiers dupliqués

• Utilisez intelligemment les événements

• Rendez l’Ajax « cachable »

Page 91: Performances

Javascript• N’utilisez pas de packer

• Évitez les fichiers dupliqués

• Utilisez intelligemment les événements

• Rendez l’Ajax « cachable »

• Minimifiez + GZip

Page 92: Performances

Javascript• N’utilisez pas de packer

• Évitez les fichiers dupliqués

• Utilisez intelligemment les événements

• Rendez l’Ajax « cachable »

• Minimifiez + GZip

• Attention aux requêtes DNS

Page 93: Performances

Javascript• N’utilisez pas de packer

• Évitez les fichiers dupliqués

• Utilisez intelligemment les événements

• Rendez l’Ajax « cachable »

• Minimifiez + GZip

• Attention aux requêtes DNS

• Évitez les redirections

Page 94: Performances

Javascript• N’utilisez pas de packer

• Évitez les fichiers dupliqués

• Utilisez intelligemment les événements

• Rendez l’Ajax « cachable »

• Minimifiez + GZip

• Attention aux requêtes DNS

• Évitez les redirections

• Configurez les ETag

Page 95: Performances

Javascripteval() is evil

Page 96: Performances

Javascripteval() is evil

NON

Page 97: Performances

Javascript

new Boolean(); // Argl…new Number(); // Stop…new String(); // Je souffrenew Object(); // Arrêtez…new Array(); // C'en est tropnew Function(); // PAN!

var bool = false;var nb = 0;var str = "";var obj = {};var array = [];var fn = function() {};

new is evil

Page 98: Performances

JavascriptOptimisez vos boucles

Page 99: Performances

Javascript

var users = []; // 1000+ itemsfor (var i = 0; i < users.length; i++) { … }

Optimisez vos boucles

Page 100: Performances

Javascript

var users = []; // 1000+ itemsfor (var i = 0; i < users.length; i++) { … }

Optimisez vos boucles

for (var i = 0, j = users.length; i < j; i++) { … }

Page 101: Performances

JavascriptAttention aux fonctions anonymes

Page 102: Performances

JavascriptAttention aux fonctions anonymes

$(…).click(function(e) { … }); // jQuery stylevar fn = function(a, b) { return a * b; };

Page 103: Performances

JavascriptAttention aux fonctions anonymes

// Mieux !function fn(a, b) { return a * b; }

$(…).click(function(e) { … }); // jQuery stylevar fn = function(a, b) { return a * b; };

Page 104: Performances

JavascriptAttention aux fonctions anonymes

// Mieux !function fn(a, b) { return a * b; }

$(…).click(function(e) { … }); // jQuery stylevar fn = function(a, b) { return a * b; };

var fn = function fn(a, b) { return a * b; };var obj = { fn: function fn(a, b) { return a * b; }}

Page 105: Performances

JavascriptPré-compiler les RegExp

Page 106: Performances

for (var index = 0, l = links.length; index < l; index++) { if (links[index].href.match(/www\.mydomain\.tld/i)) { // … }}

JavascriptPré-compiler les RegExp

Page 107: Performances

JavascriptPré-compiler les RegExp

var rDomain = /www\.mydomain\.tld/i;for (var index = 0, l = links.length; index < l; index++) { if (links[index].href.match(rDomain)) { // … }}

Page 108: Performances

JavascriptPré-compiler les RegExp

var rDomain = /www\.mydomain\.tld/i;for (var index = 0, l = links.length; index < l; index++) { if (rDomain.test(links[index].href)) { // … }}

Page 109: Performances

Javascriptlength est aussi un setter

Page 110: Performances

Javascriptlength est aussi un setter

var names = ["Geoffrey", "Lorraine", "Thomas", "Clément", "Julien", "Vincent", "Elodie", "Bruno", "Derek", "Lina", "Cyril", "Matti", "Thomas", "Estelle", "Ludovic", "Cédric", "Laurent", "Benjamin", "Mathieu", "Michel", "Kris", "Joffrey", "Alexandre", "Surya", "Antoine", "Ornella", "Simon", "Pierre", "Julien", "Jérémy", "Stéphane", "Arnaud", "Florent", "Albéric", "Julien", "Michaël", "Arnaud", "Dimitri", "Sylvain", "Alexandre", "Thomas", "François", "Robin", "Tugdual", "Prakash", "Carine", "Thomas", "Grégory", "Jean-Kamal", "Anand", "Loïc", "Xavier", "Guillaume", "Damien", "Adrien", "Antoine", "Lucas", "Romain", "Charles", "Loïc", "Maxime", "Gaëtan", "Clément", "Jean-Michel", "Hedi", "Lydie", "Raphaël", "Maxime", "Ludovic", "Audrey", "Frédéric"];

Page 111: Performances

Javascriptlength est aussi un setter

var names = ["Geoffrey", "Lorraine", "Thomas", "Clément", "Julien", "Vincent", "Elodie", "Bruno", "Derek", "Lina", "Cyril", "Matti", "Thomas", "Estelle", "Ludovic", "Cédric", "Laurent", "Benjamin", "Mathieu", "Michel", "Kris", "Joffrey", "Alexandre", "Surya", "Antoine", "Ornella", "Simon", "Pierre", "Julien", "Jérémy", "Stéphane", "Arnaud", "Florent", "Albéric", "Julien", "Michaël", "Arnaud", "Dimitri", "Sylvain", "Alexandre", "Thomas", "François", "Robin", "Tugdual", "Prakash", "Carine", "Thomas", "Grégory", "Jean-Kamal", "Anand", "Loïc", "Xavier", "Guillaume", "Damien", "Adrien", "Antoine", "Lucas", "Romain", "Charles", "Loïc", "Maxime", "Gaëtan", "Clément", "Jean-Michel", "Hedi", "Lydie", "Raphaël", "Maxime", "Ludovic", "Audrey", "Frédéric"];

names.slice(0, 10); // Biennames.length = 10; // Super rapide

Page 112: Performances

Javascriptlength est aussi un setter

var names = ["Geoffrey", "Lorraine", "Thomas", "Clément", "Julien", "Vincent", "Elodie", "Bruno", "Derek", "Lina", "Cyril", "Matti", "Thomas", "Estelle", "Ludovic", "Cédric", "Laurent", "Benjamin", "Mathieu", "Michel", "Kris", "Joffrey", "Alexandre", "Surya", "Antoine", "Ornella", "Simon", "Pierre", "Julien", "Jérémy", "Stéphane", "Arnaud", "Florent", "Albéric", "Julien", "Michaël", "Arnaud", "Dimitri", "Sylvain", "Alexandre", "Thomas", "François", "Robin", "Tugdual", "Prakash", "Carine", "Thomas", "Grégory", "Jean-Kamal", "Anand", "Loïc", "Xavier", "Guillaume", "Damien", "Adrien", "Antoine", "Lucas", "Romain", "Charles", "Loïc", "Maxime", "Gaëtan", "Clément", "Jean-Michel", "Hedi", "Lydie", "Raphaël", "Maxime", "Ludovic", "Audrey", "Frédéric"];

names = []; // Biennames.length = 0; // Terriblement rapide

names.slice(0, 10); // Biennames.length = 10; // Super rapide

Page 113: Performances

Javascriptobj.x === obj["x"]

Page 114: Performances

Javascriptobj.x === obj["x"]

var angle = 60, result;if (useSin) { result = Math.sin(angle);} else { result = Math.cos(angle);}return result;

Page 115: Performances

Javascriptobj.x === obj["x"]

var angle = 60;if (useSin) { return Math.sin(angle);} else { return Math.cos(angle);}

Page 116: Performances

Javascriptobj.x === obj["x"]

var angle = 60;return (useSin) ? Math.sin(angle) : Math.cos(angle);

Page 117: Performances

Javascriptobj.x === obj["x"]

return Math[useSin ? "sin" : "cos"](60);

Page 118: Performances

JavascriptMicro-optimisations

Page 119: Performances

Javascript

var a = 1;var b = 2;

var a = 1, b = 2;

Micro-optimisations

Page 120: Performances

Javascript

times = times || 3;times |= 3; // Valeur numérique uniquement

var a = 1;var b = 2;

var a = 1, b = 2;

Micro-optimisations

Page 121: Performances

JavascriptMicro-optimisations

Page 122: Performances

Javascript

if (value == 3) {}if (value === 3) {}

Micro-optimisations

Page 123: Performances

Javascript

if (1 == 1 || true) {}if (true || 1 == 1) {}

if (value == 3) {}if (value === 3) {}

Micro-optimisations

Page 124: Performances

Javascript

new Date().getTime()

if (1 == 1 || true) {}if (true || 1 == 1) {}

if (value == 3) {}if (value === 3) {}

Micro-optimisations

Page 125: Performances

Javascript

new Date().getTime()Date.now()

if (1 == 1 || true) {}if (true || 1 == 1) {}

if (value == 3) {}if (value === 3) {}

Micro-optimisations

Page 126: Performances

Javascript

new Date().getTime()Date.now()+new Date

if (1 == 1 || true) {}if (true || 1 == 1) {}

if (value == 3) {}if (value === 3) {}

Micro-optimisations

Page 127: Performances

JavascriptMicro-optimisations

Page 128: Performances

JavascriptMicro-optimisations

delete obj.x

Page 129: Performances

JavascriptMicro-optimisations

delete obj.x

objet.tres.interessant.mais.bien.cache

Page 130: Performances

JavascriptUtilisez DocumentFragment

var fragment = document.createDocumentFragment();var div = document.createElement('div');…fragment.appendChild(div);

document.getElementById('box') .appendChild(fragment.cloneNode(true));

Page 131: Performances

JavascriptMinimisez les accès au DOM

$('#box a').click(…);$('#box a').addClass(…);$('#box a').attr(…);

var box = $('#box a');box.click(…);box.addClass(…);box.attr(…);

Page 132: Performances

CSS

Page 133: Performances

CSS

• Évitez filter

Page 134: Performances

CSS

• Évitez filter

• Évitez @import

Page 135: Performances

CSS

• Évitez filter

• Évitez @import

• Évitez expression

Page 136: Performances

CSS

• Évitez filter

• Évitez @import

• Évitez expression

• Évitez les reflows

Page 137: Performances

CSS

• Évitez filter

• Évitez @import

• Évitez expression

• Évitez les reflows

• Optimisez les sélecteurs

Page 138: Performances

CSS

• Évitez filter

• Évitez @import

• Évitez expression

• Évitez les reflows

• Optimisez les sélecteurs

#box .footer ul li a span

Page 139: Performances

CSS

• Évitez filter

• Évitez @import

• Évitez expression

• Évitez les reflows

• Optimisez les sélecteurs

#box .footer ul li a span .footer-link span

Page 140: Performances

Images

• Pas de GIF

• Optimisez les images

• Supprimez les metas (smush.it, pngcrush, jpegtrans)

Page 141: Performances

Images

• Pas de GIF

• Optimisez les images

• Supprimez les metas (smush.it, pngcrush, jpegtrans)

+ =PNG24 (3932 octets)

Page 142: Performances

Images

• Pas de GIF

• Optimisez les images

• Supprimez les metas (smush.it, pngcrush, jpegtrans)

+ =PNG24 (3932 octets)

+ =PNG8 64 couleurs (661 octets)

Page 143: Performances

Images

• Pas de GIF

• Optimisez les images

• Supprimez les metas (smush.it, pngcrush, jpegtrans)

+ =PNG24 (3932 octets)

+ =PNG8 64 couleurs (661 octets)

+ =PNG8 64 couleurs (673 octets)

Page 144: Performances

Images

• Pas de GIF

• Optimisez les images

• Supprimez les metas (smush.it, pngcrush, jpegtrans)

+ =PNG24 (3932 octets)

+ =PNG8 64 couleurs (661 octets)

+ =PNG8 64 couleurs (673 octets)

PNG8 64 couleurs (673 octets)

Page 145: Performances

Images

• Pas de GIF

• Optimisez les images

• Supprimez les metas (smush.it, pngcrush, jpegtrans)

+ =PNG24 (3932 octets)

+ =PNG8 64 couleurs (661 octets)

+ =PNG8 64 couleurs (673 octets)

PNG8 64 couleurs (673 octets) PNG8 64 couleurs (628 octets)

Page 146: Performances

Images

• Pas de GIF

• Optimisez les images

• Supprimez les metas (smush.it, pngcrush, jpegtrans)

+ =PNG24 (3932 octets)

+ =PNG8 64 couleurs (661 octets)

+ =PNG8 64 couleurs (673 octets)

PNG8 64 couleurs (673 octets) PNG8 64 couleurs (628 octets)

- 6,7%

Page 147: Performances

Images

Page 148: Performances

Images

• Spécifiez les dimensions

Page 149: Performances

Images

• Spécifiez les dimensions

• Ne les redimensionnez pas

Page 150: Performances

Images

• Spécifiez les dimensions

• Ne les redimensionnez pas

• Utilisez les sprites

Page 151: Performances

Favicon

Page 152: Performances

Favicon

• Pensez-y, évite une 404

Page 153: Performances

Favicon

• Pensez-y, évite une 404

• Image/icone optimisée

Page 154: Performances

En général

Page 155: Performances

En général

✓ Faites le moins de requête DNS

Page 156: Performances

En général

✓ Faites le moins de requête DNS

✓ Faites le moins de requête HTTP

Page 157: Performances

En général

✓ Faites le moins de requête DNS

✓ Faites le moins de requête HTTP

✓ Évitez les redirections

Page 158: Performances

En général

✓ Faites le moins de requête DNS

✓ Faites le moins de requête HTTP

✓ Évitez les redirections

✓ Évitez les 404

Page 159: Performances

Ressources (outils)• Firebug http://getfirebug.com

• YSlow http://developer.yahoo.com/yslow/

• WebPagetest http://www.webpagetest.org

• Yottaa http://www.yottaa.com

• YUI Compressor http://developer.yahoo.com/yui/compressor/

• Smush.it http://www.smushit.com/ysmush.it/

• SpriteMe http://spriteme.org

Page 160: Performances

Ressources• Comprendre le cache

http://www.mnot.net/cache_docs/index.fr.html

• Performance Playground http://jsperf.com

• Éric Daspet http://performance.survol.fr

• Stoyan Stephanov http://www.phpied.com

• Steve Souders http://www.stevesouders.com/blog/