Université Claude Bernard Lyon 1 - M2 TIW - Intergiciels et Services

TP Web Performance

Objectifs pédagogiques du TP

Outils

À faire avant de débuter le TP : désactiver le cache (jusqu'à instruction contraire) et les plugins de blocage de contenus (Adblock, Ghostery...) de votre navigateur.

Rendu du TP

Ce TP est à rendre pour le samedi 4 février 2017 à 23h59 sous forme de :

Les éléments en bleu indiquent les opérations à réaliser en lien avec le questionnaire ou le rapport.

1. Analyse d'une application Web

Dans un premier temps, vous allez réaliser l'analyse d'une application Web existante : celle de l'Université Claude Bernard Lyon 1.

Analyse avec Chrome Dev Tools

Ouvrez les Dev Tools de Chrome (onglets Network, puis Performance ou Timeline, selon les versions). Lancez le chargement de l'application et identifiez les différents temps indiqués :

Indiquez ces valeurs dans votre rapport.

Utilisation des APIs de performance

À l'aide du document Performance Timing Primer et de la spec Navigation Timing Level 1 et Level 2, déterminez (et exécutez dans la console) une formule qui vous permettra d'obtenir automatiquement les temps de récupération de la page HTML et de création du DOM.
Aide : le comptage du temps commence à navigationStart.

À l'aide de la spec Performance Timeline Level 1 et Level 2, créez des scripts (et exécutez-les dans la console) pour obtenir automatiquement temps de chargement des ressources nécessaires à la création du CSSDOM, de l'app shell et du CRP.
Aide : en fonction de vos observations de la question précédente, vous devrez identifier les ressources qui interviennent pour chacun de ces éléments.

Afin de diminuer l'impact des fluctuations du réseau, créez un script qui lance 10 fois les mesures précédentes, les stocke, et établit une moyenne sur les 8 médianes. Faites afficher à ce script les 5 résultats séparés par des virgules (CSV) ou des tabulations.

Dans votre questionnaire Spiral : copiez-collez le code de votre script dans la question correspondante.

Pour automatiser les questions suivantes, après chaque série de mesure, vous stockerez les données obtenues dans votre tableur préféré.

Modification du contexte client

Renouvelez maintenant vos mesures en simulant :

  1. un réseau 3G moyen (network throttling).
  2. un appareil plus ancien : CPU ralenti 2x (CPU throttling)
  3. les deux types de ralentissements précédents à la fois
Dans votre rapport : compilez l'ensemble des données collectées pour les différents types de conditions, et faites-en un tableau "human-readable". Extrayez-en un graphique permettant de comparer les différentes valeurs pour chacune de ces conditions. Tirez-en une conclusion.

Analyse avec WebPageTest

Allez sur le site WebPageTest.

Synthétisez vos observations et répondez à la question ci-dessus dans votre rapport.

2. Optimisation d'une application Web

À l'aide du cours et des observations que vous avez faites à la question précédente, vous allez améliorer une application existante. L'application en question est l'une des premières versions du site du département info. Elle est à peu près fonctionnelle, mais pas encore optimisée. Vous trouverez cette application dans ce projet forge. Quelques informations au sujet de cette application :

Dans cette partie, vous essayerez - autant que possible - de réaliser toutes les mesures dans les mêmes conditions (machines cliente et serveur). Par conséquent, lisez les instructions jusqu'au bout avant de déployer l'application.

Clonez cette application et initialisez un projet forge dans lequel vous pousserez vos modifications. À la racine du projet forge, ajoutez le fichier JS qui contient votre script de mesure de performances.

Indiquez dans le questionnaire Spiral l'id (fin de l'URL) de ce projet.

Préambule

Faites pour cette page les 4 mêmes mesures que dans la question précédente (conditions normales et dégradées), à l'aide des scripts que vous avez écrits précédemment. Stockez ces données dans un nouveau fichier tableur.

Chemin critique de rendu

  1. Déterminez la tâche principale que l'utilisateur veut pouvoir effectuer en arrivant sur l'application
  2. Déterminez la quantité minimale de ressources nécessaires pour effectuer cette tâche
  3. Refactorez votre front pour que ces ressources soient chargées et affichées en premier et pour fixer la dimension de l'image sur la page
  4. Faites en sorte que les ressources secondaires soient récupérées de façon asynchrone, une fois que la page a été rendue
Refaites une série de mesures de performances que vous ajouterez à votre tableau. Notez dans votre rapport les modifications effectuées et les améliorations obtenues à cette étape.

Optimisation par ressource

Vous allez maintenant optimiser les ressources en fonction de leurs types. En fonction des contenus et de la structure de votre application, essayez certaines des optimisations suivantes, et consignez les résultats dans votre rapport :

Feuilles de style
  • le cas échéant, supprimez les directives @import de la feuille de style
  • éventuellement, répartissez les directives de style entre une feuille externe (commune à votre application) et une feuille incluse dans la page HTML (pour les styles spécifiques à l'interface de chat)
  • "minifiez" le CSS en utilisant un outil en ligne
Scripts et fichiers statiques
  • commencez par optimiser votre code en appliquant quelques bonnes pratiques "simples" comme celles listées ici
  • analysez le cycle de vie de vos différents éléments JS (fonctions, objets...) et les tâches auxquelles ils correspondent
  • si certaines parties doivent être générées dynamiquement (et ne peuvent pas être stockées sous forme de fichiers statiques), séparez-les de ces fichiers, et considérez-les comme des donnes asynchrones (voir plus bas)
  • groupez les éléments statiques similaires, en fonction des premières tâches pour lesquelles ils sont nécessaires, et "minifiez" chaque groupe
  • dans la page HTML, mettez en place des mécanismes de chargement adaptés (async ou defer), et bien entendu, placez-les dans la page afin qu'ils se déclenchent aux bons moments
Données asynchrones générées dynamiquement
  • comme précédemment, analysez le cycle de vie de vos données et à quels moments elles sont nécessaires au fonctionnement de l'application
  • pour celles qui font partie de la tâche critique, forcez-en le chargement (en une seule transaction HTTP) dès le début de la lecture de la page
  • groupez les autres en fonction des premières tâches pour lesquelles elles sont nécessaires, et faites en sorte que l'envoi de chaque groupe soit de taille aussi réduite que possible
  • côté serveur, optimisez les processus de génération de ces données, par exemple en utilisant des variables intermédiaires pour pré-calculer ou mémoriser des valeurs, ou en diminuant la complexité de vos algorithmes
  • faites en sorte que les scripts d'intégration de ces données au DOM ne perturbent pas le rafraîchissement de la page (voir ici)
Images
Enregistrez votre/vos image(s) :
  • sous différents formats adaptés aux navigateurs (et mettez en place les mécanismes côté serveur permettant de servir l'image adaptée au client)
  • sous différentes résolutions adaptées à la fenêtre du navigateur (et mettez en place les mécanismes côté client permettant de requêter l'image de taille correspondante)

Remarque : il ne vous est pas demandé de modifier le type de sérialisation (XML / JSON) des données transférées de façon asynchrone.

Pour chaque type de ressources, refaites une série de mesures de performances à l'aide de votre script, stockez les données et notez les modifications et les améliorations.

Optimisations des transactions réseau

À partir de cette question, ré-activez le cache navigateur.

Pour chaque type d'optimisation, refaites une série de mesures de performances, stockez les données et notez les modifications et les améliorations.

Optimisation du serveur

Actuellement, vous passez par un Apache / nginx muni d'un interprêteur PHP pour accéder aux contenus côté serveur. Ce n'est pourtant pas nécessaire de mettre en oeuvre toutes leurs mécaniques pour servir les fichiers statiques. Revenez aux fondamentaux et inspirez-vous du premier TP de MIF13 pour mettre un serveur nginx/Apache en front, qui sera capable de :

Pour chaque type d'optimisation, refaites une série de mesures de performances, stockez les données et notez les modifications et les améliorations.

Récapitulatif des instructions de rendu

Au final, votre rendu comportera les éléments ci-dessous.

Rapport

Générez un PDF comportant : Uploadez ce fichier dans la question "Compte-rendu d'optimisation" + enregistrez-le à la racine de votre projet forge.

Projet forge

Votre projet devra contenir les éléments suivants : N'oubliez pas de mettre vos encadrants en tant que reporters du projet.

Questionnaire Spiral

Vous devez avoir :
Licence Creative Commons
Valid XHTML 1.0 Strict