{"id":2809,"date":"2014-02-03T01:08:50","date_gmt":"2014-02-03T00:08:50","guid":{"rendered":"http:\/\/www.alphak.net\/news\/?p=2809"},"modified":"2014-02-03T01:08:50","modified_gmt":"2014-02-03T00:08:50","slug":"speed-daemon","status":"publish","type":"post","link":"https:\/\/www.alphak.net\/news\/2014\/02\/speed-daemon\/","title":{"rendered":"Speed Daemon"},"content":{"rendered":"<p><span style=\"color: #ff0000;\"><strong>Avertissement :<\/strong><\/span> cet article est une tentative maladroite de mise en ligne d&rsquo;un billet r\u00e9dig\u00e9 en mode express, en vue de faire patienter mon lectorat en qu\u00eate de vrais sujets, et afin de masquer mon incapacit\u00e9 \u00e0 finaliser la r\u00e9daction de vrais articles int\u00e9ressants sur mes projets en cours.<\/p>\n<p>La faute \u00e9tant avou\u00e9e et \u00e0 moiti\u00e9 pardonn\u00e9e, d\u00e9voilons le th\u00e8me de l&rsquo;article d\u00e9lictueux dont le titre laisse entrevoir un l\u00e9ger indice, pour peu qu&rsquo;on ait absorb\u00e9 suffisamment d&rsquo;alcool fort : la <strong>vitesse de chargement<\/strong> de ce site.<!--more--><\/p>\n<p>Depuis la mise en ligne de ce blog puis sa migration sous WordPress, celui-ci s&rsquo;est <strong>alourdi<\/strong> au fil des ann\u00e9es. La faute \u00e0 l&rsquo;utilisation croissante de plugins, pas toujours utiles et pas tout bien \u00e9crits, \u00e0 une impl\u00e9mentation de webdesign perfectible, \u00e0 une architecture de site devenant inadapt\u00e9e avec le temps. R\u00e9sultat, il y a 6 mois en arri\u00e8re, le constat \u00e9tait amer : un temps de chargement des pages beaucoup, beaucoup trop long.<\/p>\n<p>Bien s\u00fbr, cela aurait pu \u00eatre en partie occult\u00e9 par un d\u00e9bit sup\u00e9rieur, si j&rsquo;avais \u00e9t\u00e9 raccord\u00e9 \u00e0 la fibre, depuis le temps que je l&rsquo;attends &#8211; <em>un jour elle sera mienne, oh oui, un jour elle sera mienne<\/em> &#8211; mais l&rsquo;\u00e9tude d\u00e9taill\u00e9e des graphes de chargement de mes pages montrait que le d\u00e9bit ADSL n&rsquo;\u00e9tait pas le seul \u00e0 la ramasse. Le temps de g\u00e9n\u00e9ration des pages par le serveur \u00e9tait \u00e9galement responsable du massacre.<\/p>\n<p><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2014\/01\/elle-sera-mienne.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2818\" alt=\"elle-sera-mienne\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2014\/01\/elle-sera-mienne.jpg\" width=\"634\" height=\"336\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2014\/01\/elle-sera-mienne.jpg 634w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2014\/01\/elle-sera-mienne-300x159.jpg 300w\" sizes=\"(max-width: 634px) 100vw, 634px\" \/><\/a><\/p>\n<p>Je devais donc intervenir. Voici donc un petit aper\u00e7u des am\u00e9liorations qui ont \u00e9t\u00e9 entreprises \u00e0 partir d&rsquo;ao\u00fbt 2013 en vue d&rsquo;am\u00e9liorer l&rsquo;exp\u00e9rience utilisateur. Les tests de perfs ont \u00e9t\u00e9 r\u00e9alis\u00e9s avec les outils <a href=\"http:\/\/tools.pingdom.com\/fpt\/\" target=\"_blank\">Pingdom Website Speed Test<\/a> et <a href=\"https:\/\/developers.google.com\/speed\/pagespeed\/insights\/\" target=\"_blank\">Google PageSpeed Insights<\/a>.<\/p>\n<h3>Travail sur le webdesign<\/h3>\n<p>Graphiquement, tr\u00e8s peu de diff\u00e9rence. Dans les faits, je me suis arrang\u00e9 pour <strong>diviser par 3<\/strong> le nombre de ressources sur les pages, et donc de diviser par la m\u00eame quantit\u00e9 le nombre de requ\u00eates que le navigateur doit lancer pour charger une page de mani\u00e8re compl\u00e8te. Quelques techniques en vrac :<\/p>\n<ul>\n<li>Suppression de l&rsquo;affichage \u00e0 outrance de certaines images, l\u00e0 o\u00f9 elles n&rsquo;\u00e9taient pas n\u00e9cessaires.<\/li>\n<li>Agr\u00e9gation de javascripts et CSS en un seul fichier.<\/li>\n<li>Remplacement de certaines images par du CSS3 &#8211; au diable si le site devient illisible pour les utilisateurs d&rsquo;IE6.<\/li>\n<li>Utilisation de <a href=\"http:\/\/www.alsacreations.com\/tuto\/lire\/1068-sprites-css-background-position.html\" target=\"_blank\">sprites CSS<\/a>, c&rsquo;est \u00e0 dire l&rsquo;agr\u00e9gation de nombreuses images en une seule et utilisation de CSS pour n&rsquo;afficher que la partie d\u00e9sir\u00e9e de l&rsquo;image r\u00e9sultante.<\/li>\n<\/ul>\n<h3>Travail sur les plugins<\/h3>\n<p>De nombreux plugins, charg\u00e9s sur chaque page, ralentissent la g\u00e9n\u00e9ration des pages. \u00c9videmment, la premi\u00e8re \u00e9tape consiste \u00e0 \u00e9tablir le bilan des plugins r\u00e9ellement utiles et de ceux dont on peut se passer d\u00e9finitivement, en pond\u00e9rant par leur propension \u00e0 ralentir le site. J&rsquo;ai utilis\u00e9 <a href=\"http:\/\/wordpress.org\/plugins\/p3-profiler\/\" target=\"_blank\">Plugin Performance Profiler<\/a>, qui est lui-m\u00eame un plugin, pour faire un \u00e9tat des lieux des plus mauvais \u00e9l\u00e8ves. J&rsquo;ai ensuite pris les d\u00e9cisions suivantes :<\/p>\n<ul>\n<li><a href=\"http:\/\/wordpress.org\/plugins\/stats\/screenshots\/\" target=\"_blank\">WordPress.com stats<\/a> a \u00e9t\u00e9 remplac\u00e9 par <a href=\"http:\/\/jetpack.me\/\" target=\"_blank\">Jetpack<\/a>. Nan, je d\u00e9conne. J&rsquo;allais pas remplacer un plugin lent comme un escargot sous influence de cannabis par un plugin lourd comme un troupeau de mammouths ob\u00e8ses. Pour mes stats, j&rsquo;ai d\u00e9cid\u00e9 d&rsquo;en d\u00e9l\u00e9guer la gestion \u00e0 <a href=\"http:\/\/www.google.com\/analytics\/\" target=\"_blank\">Google Analytics<\/a>, avant de migrer sur <a href=\"http:\/\/piwik.org\/\" target=\"_blank\">Piwik<\/a> en auto-h\u00e9berg\u00e9, pas aussi rapide que le premier mais me permettant de ma\u00eetriser int\u00e9gralement mes donn\u00e9es.<\/li>\n<li><a href=\"http:\/\/wordpress.org\/plugins\/bwp-minify\/\" target=\"_blank\">Better WordPress Minify<\/a> ne fonctionnait plus correctement, il a \u00e9t\u00e9 d\u00e9gag\u00e9. Je g\u00e8re la minification des ressources statiques et leur agr\u00e9gation tout seul comme un grand.<\/li>\n<li><a href=\"http:\/\/wordpress.org\/plugins\/social-media-widget\/\" target=\"_blank\">Social Media Widget<\/a> a \u00e9t\u00e9 remplac\u00e9 par une adaptation plus l\u00e9g\u00e8re directement int\u00e9gr\u00e9e dans le th\u00e8me.<\/li>\n<li><a href=\"http:\/\/wordpress.org\/plugins\/contact-form-7\/\" target=\"_blank\">Contact Form 7<\/a>, utilis\u00e9 sur une seule page du site, chargeait du contenu sur toutes les pages. Remplac\u00e9 par une impl\u00e9mentation perso, int\u00e9gr\u00e9e au th\u00e8me et avec de l&rsquo;Ajax pour plus de classe.<\/li>\n<li><a href=\"http:\/\/wordpress.org\/plugins\/syntaxhighlighter\/\" target=\"_blank\">Syntax Highlighter Evolved<\/a>, utilis\u00e9 sur une minorit\u00e9 de pages, chargeait bon nombre de contenu sur la quasi-totalit\u00e9 des pages du site. Remplac\u00e9 par <a href=\"http:\/\/betterwp.net\/wordpress-plugins\/bwp-syntax\/\" target=\"_blank\">Better WordPress Syntax<\/a>, un peu moins sexy mais plus fiable et plus l\u00e9ger.<\/li>\n<li><a href=\"http:\/\/wordpress.org\/plugins\/highlight-author-comments\/\" target=\"_blank\">Highlight Author Comments<\/a> a \u00e9t\u00e9 remplac\u00e9 par une impl\u00e9mentation personnelle directement int\u00e9gr\u00e9e au th\u00e8me.<\/li>\n<li><a href=\"http:\/\/wordpress.org\/plugins\/post-teaser\/\" target=\"_blank\">Post Teaser<\/a>, plugin de 1150 lignes, a \u00e9t\u00e9 remplac\u00e9 par une impl\u00e9mentation personnelle de 150 lignes beaucoup plus propre et performante, bas\u00e9e sur le projet <a href=\"http:\/\/code.google.com\/p\/htmlcutting\/\" target=\"_blank\">htmlcutting<\/a> : le temps de g\u00e9n\u00e9ration des teasers sur la page d&rsquo;accueil a \u00e9t\u00e9 divis\u00e9 par 2.<\/li>\n<\/ul>\n<h3>Travail sur l&rsquo;architecture<\/h3>\n<p>Un travail beaucoup plus en profondeur, qui demande parfois de se poser les bonnes questions quant \u00e0 la mani\u00e8re dont les ressources doivent \u00eatre charg\u00e9es, parfois \u00e0 changer des briques logicielles, parfois \u00e0 changer des briques mat\u00e9rielles.<\/p>\n<ul>\n<li>Stockage sur SSD : j&rsquo;avais un SSD non utilis\u00e9 (oui, \u00e7a arrive) depuis plusieurs mois, mais l&rsquo;ampleur de la t\u00e2che consistant \u00e0 cloner le disque dur du serveur sur ce SSD, tout en revoyant compl\u00e8tement l&rsquo;organisation des partitions, pour cause de diff\u00e9rence flagrante de taille entre les deux supports, m&rsquo;a fait remettre l&rsquo;op\u00e9ration \u00e0 plus tard de nombreuses fois. C&rsquo;est maintenant chose faite, et c&rsquo;est toujours quelques microsecondes de gagn\u00e9es \u00e0 chaque requ\u00eate.<\/li>\n<li>Utilisation d&rsquo;un CDN : un <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Content_delivery_network\" target=\"_blank\">Content Delivery Network<\/a>, pour faire simple, c&rsquo;est un site qui a du d\u00e9bit et qui accepte d&rsquo;h\u00e9berger en miroir une partie du contenu de votre site. C&rsquo;est pratique et expliqu\u00e9 en vid\u00e9o, de mani\u00e8re un peu simpliste, <a href=\"https:\/\/fr.cloudflare.com\/\" target=\"_blank\">\u00e0 cet endroit<\/a>. Int\u00e9grer un CDN proprement dans WordPress n&rsquo;est pas forc\u00e9ment une mince affaire, contrairement \u00e0 ce que peut laisser pr\u00e9tendre la vid\u00e9o en question, mais c&rsquo;est fait. Quelques millisecondes de gagn\u00e9es \u00e0 chaque requ\u00eate.<\/li>\n<li>Utilisation d&rsquo;un cache : le plugin <a href=\"http:\/\/wordpress.org\/plugins\/wp-super-cache\/\" target=\"_blank\">WP Super Cache<\/a> garde une copie de chaque article, et sert cette copie \u00e0 la place d&rsquo;un article qu&rsquo;il faut normalement reg\u00e9n\u00e9rer \u00e0 chaque consultation, lorsqu&rsquo;on n&rsquo;a pas le plugin. Les gains sont consid\u00e9rables. Quelques secondes de gagn\u00e9es \u00e0 chaque requ\u00eate. Ouais.<\/li>\n<\/ul>\n<h3>Conclusion<\/h3>\n<p>Au del\u00e0 du luxe d&rsquo;avoir pu \u00e9crire un article dont le titre est une double r\u00e9f\u00e9rence de <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Daemon_%28informatique%29\" target=\"_blank\">culture geek<\/a> et <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Speed_Demon_%28chanson%29\" target=\"_blank\">culture pop<\/a>, les changements ont \u00e9t\u00e9 effectu\u00e9s en profondeur au prix de nombreux efforts, mais ont donn\u00e9 un r\u00e9sultat tr\u00e8s correct. Gr\u00e2ce \u00e0 tous les axes de travail d\u00e9crits pr\u00e9c\u00e9demment, le temps de chargement de mes pages a \u00e9t\u00e9 <strong>divis\u00e9 par 10<\/strong> entre ao\u00fbt et d\u00e9cembre 2013. Le chargement pourra encore sembler long \u00e0 certains par moments, il n&rsquo;en sera que bien meilleur quand je b\u00e9n\u00e9ficierai enfin d&rsquo;un acc\u00e8s fibre &#8211; <em>je l&rsquo;aurai un jour, je l&rsquo;aurai<\/em>.<\/p>\n<p><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2014\/01\/je-l-aurai-un-jour.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2817\" alt=\"je-l-aurai-un-jour\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2014\/01\/je-l-aurai-un-jour.jpg\" width=\"634\" height=\"336\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2014\/01\/je-l-aurai-un-jour.jpg 634w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2014\/01\/je-l-aurai-un-jour-300x159.jpg 300w\" sizes=\"(max-width: 634px) 100vw, 634px\" \/><\/a><\/p>\n<p>Ah oui, tant qu&rsquo;\u00e0 faire, puisqu&rsquo;on baigne en pleine culture geek, Speed Demon (avec cette orthographe) est aussi un <a href=\"http:\/\/www.marvel-world.com\/encyclopedie-673-fiche-speed-demon-biographie.html\" target=\"_blank\">personnage du marvelverse<\/a>.<\/p>\n<p>C&rsquo;est tout pour aujourd&rsquo;hui. Dans mon prochain article, on continue \u00e0 essayer de piloter le chauffage en reprenant la devise de la maison Stark.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span style=\"color: #ff0000;\"><strong>Avertissement :<\/strong><\/span> cet article est une tentative maladroite de mise en ligne d&rsquo;un billet r\u00e9dig\u00e9 en mode express, en vue de faire patienter mon lectorat en qu\u00eate de vrais sujets, et afin de masquer mon incapacit\u00e9 \u00e0 finaliser la r\u00e9daction de vrais articles int\u00e9ressants sur mes projets en cours.<\/p>\n<p>La faute \u00e9tant avou\u00e9e et \u00e0 moiti\u00e9 pardonn\u00e9e, d\u00e9voilons le th\u00e8me de l&rsquo;article d\u00e9lictueux dont le titre laisse entrevoir un l\u00e9ger indice, pour peu qu&rsquo;on ait absorb\u00e9 suffisamment d&rsquo;alcool fort : la <strong>vitesse de chargement<\/strong> de ce site.<\/p>\n\t<div class=\"post-teaser-block\">\r\n\t\t<div class=\"teaserHellip\">\r\n\t\t\t<span class=\"teaserLeft\">[<\/span><span class=\"teaserCenter\">&hellip;<\/span><span class=\"teaserRight\">]<\/span>\r\n\t\t<\/div>\r\n\t\t<div class=\"teaserText\">\r\n\t\t\t<a href=\"https:\/\/www.alphak.net\/news\/2014\/02\/speed-daemon\/\" title=\"Speed Daemon\" rel=\"bookmark\"><span class=\"teaserlink\">Lire la suite de l'article&nbsp;<i class=\"fa fa-chevron-right\"><\/i><\/span><\/a>\r\n\t\t<\/div>\r\n\t\t<a class=\"teaserLink\" href=\"https:\/\/www.alphak.net\/news\/2014\/02\/speed-daemon\/\" title=\"Speed Daemon\" rel=\"bookmark\"><\/a>\r\n\t<\/div>\r\n","protected":false},"author":1,"featured_media":2822,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[89,340,75,341,336,338,337,339,335,56],"class_list":["post-2809","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projet-web","tag-cache","tag-cdn","tag-css","tag-experience-utilisateur","tag-minification","tag-plugin","tag-sprite","tag-ssd","tag-webdesign","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2809"}],"collection":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/comments?post=2809"}],"version-history":[{"count":10,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2809\/revisions"}],"predecessor-version":[{"id":2828,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2809\/revisions\/2828"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media\/2822"}],"wp:attachment":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media?parent=2809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/categories?post=2809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/tags?post=2809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}