Le moteur JavaScript V8 optimise l’accès aux propriétés grâce aux classes cachées, qui décrivent la structure des objets, et aux caches inline, qui mémorisent les structures rencontrées. Lorsque trop de formes différentes passent par le même accès, celui-ci devient mégamorphique et peut ralentir nettement : dans le benchmark présenté, passer de quatre à cinq formes double environ le temps de lecture. L’article montre comment l’ordre des propriétés, les champs conditionnels et l’opérateur delete influencent ces optimisations. Conseil : conserver des structures cohérentes et mesurer avant d’optimiser.
Sean Goedecke soutient que les lenteurs logicielles proviennent généralement davantage de la conception des programmes que du langage utilisé. Les applications passent souvent beaucoup de temps à attendre des bases de données, des API ou des accès disque, tandis que les calculs intensifs exploitent déjà des bibliothèques optimisées. Pour améliorer les performances, il recommande de profiler les applications puis de réduire le travail effectué : cache, traitements asynchrones, parallélisation et optimisation des requêtes SQL. Réécrire en Rust ou en C n'est pertinent que pour certains goulots d'étranglement réellement liés au CPU.
Dans Vue, conserve en mémoire les composants masqués au lieu de les détruire, ce qui préserve leur état lors du passage entre onglets ou pages et évite leur reconstruction. L’article montre son usage avec les composants dynamiques et Vue Router, puis explique les hooks onActivated et onDeactivated pour gérer l’entrée et la sortie du cache. Les options include, exclude et max permettent de limiter les composants conservés et de maîtriser le coût mémoire.
AutoMapper 10.3 prend en charge le composant symfony/json-streamer pour traiter de volumineux JSON en flux, avec un moteur de mapping commun à ObjectMapper et Serializer. JoliCode présente json-stream-polyfill et l’extension native json-stream, qui décodent les données à la demande et limitent l’usage mémoire, notamment en lecture séquentielle. Dans ses benchmarks sur 20 000 objets, la lecture avec extension est jusqu’à 28,6 fois plus rapide que JsonStreamer de Symfony en configuration optimisée ; l’écriture reste en revanche plus lente. L’article détaille les compromis et options d’optimisation.
Sur Geekeries.org, une optimisation de WordPress menée à partir des requêtes réellement effectuées par le navigateur, plutôt que par l’ajout de plugins, améliore sensiblement les performances. Après vérification des caches Redis et HTTPS, l’auteur corrige le décalage du logo, adapte les images en WebP, retire Bootstrap inutilisé et remplace quatre icônes Font Awesome par des SVG. Les modifications sont testées une par une et conservées dans un thème enfant. Le score PageSpeed passe de 72 à 93 sur mobile et de 73 à 100 sur ordinateur, avec un CLS nul.
En JavaScript, String.prototype.replace() avec une expression régulière globale et une fonction de rappel peut servir à parcourir les correspondances sans utiliser la chaîne produite. Cette technique permet de filtrer, extraire des données et même alimenter un analyseur lexical ; renvoyer une chaîne vide limite la mémoire gaspillée. Des benchmarks montrent toutefois que, sur V8, elle est généralement plus lente que exec() et se dégrade sur les gros textes. Pour du code neuf, l’auteur privilégie matchAll(), plus lisible et réellement itératif.
Guide pratique pour accélérer une API Symfony 7 avec Redis à partir d’un catalogue de produits. Il montre comment configurer Redis via Docker, créer un pool de cache avec tags, appliquer le modèle Cache-Aside et invalider les données après modification en base. L’article ajoute une limitation du trafic avec le composant Rate Limiter de Symfony et détaille le suivi des hits/misses, de la mémoire et des TTL. Il rappelle enfin les précautions de production : isoler Redis, éviter les données périmées et mesurer les gains réels.
Vue 3 peut laisser des watchers orphelins lorsqu’ils sont créés après un await dans un composable ou un setup() asynchrone, car ils ne sont alors plus rattachés automatiquement au scope du composant. L’article explique comment éviter ces fuites mémoire : créer les watchers synchroniquement, utiliser le top-level await de <script setup>, conserver puis arrêter explicitement les watchers différés, et s’appuyer sur onScopeDispose ou effectScope hors contexte composant. Il recommande aussi de tester les cycles montage/démontage pour détecter les effets réactifs persistants.
Plaidoyer volontairement provocateur pour un Web plus simple : beaucoup de sites de contenu n’ont pas besoin d’un framework, d’un bundler ni d’une lourde chaîne JavaScript. L’auteur montre que HTML et CSS modernes couvrent déjà l’accessibilité, les données structurées, les cartes sociales, les images responsives, le mode sombre et de nombreuses optimisations de performance. La règle proposée est simple : commencer par du HTML natif, ajouter uniquement ce qui est nécessaire, et réserver les frameworks aux véritables applications.
L'application Symfony a souffert d'épuisement de mémoire, provoquant des plantages de conteneurs nocturnes. Le développeur a d'abord suspecté une fuite de mémoire, mais l'analyse a révélé que le problème provenait de requêtes gourmandes en ressources, chacune consommant jusqu'à 512 Mo. Ces requêtes saturaient rapidement le pool de travailleurs PHP-FPM, entraînant l'indisponibilité du site.
Face à l'augmentation du contenu, le développeur a mis en place des outils de surveillance pour identifier les routes problématiques. Il a découvert cinq schémas récurrents dans Doctrine, tous contribuant à la consommation excessive de mémoire. La première cause identifiée était une hydratation complète des entités Doctrine lorsque seules quelques colonnes étaient nécessaires, comme dans le cas de la génération du sitemap.
Cette surconsommation de mémoire a été résolue en optimisant le code pour éviter l'hydratation inutile des entités. Le développeur a instrumenté son application avant de toucher au code, ce qui lui a permis de cibler précisément les problèmes. L'objectif était de réduire la quantité de données chargées et traitées par chaque requête, afin de prévenir l'épuisement de la mémoire.
L'application Symfony a rencontré des problèmes de mémoire dus à des requêtes gourmandes, saturant le pool de workers. Après analyse, cinq schémas récurrents dans Doctrine ont été identifiés comme responsables, notamment une hydratation complète des entités là où seule une partie des données était nécessaire. L'optimisation du code pour réduire la consommation de mémoire par requête a permis de résoudre le problème.
Graft est un outil open-source conçu pour améliorer les performances des agents de codage tels que Claude Code, Cursor, Codex et Gemini. Il vise à les rendre plus rapides, moins coûteux et à améliorer leur compréhension contextuelle de votre base de code, permettant ainsi des économies significatives en temps et en coût, tout en améliorant parfois la précision des résultats.
L'outil fonctionne en créant un graphe de votre base de code. Ce graphe permet aux agents d'accéder à des informations contextuelles pertinentes, réduisant ainsi le besoin de traiter l'intégralité du code à chaque requête. Graft s'intègre en douceur, notamment avec Claude Code, en ajoutant automatiquement des hooks et en gérant la génération du graphe en arrière-plan, rendant ainsi l'amélioration transparente pour l'utilisateur.
Une fonctionnalité notable de Graft est son application GitHub qui analyse automatiquement les pull requests, offrant des revues de code plus efficaces. Il supporte également une variété de langages de programmation et offre des outils en ligne de commande pour la recherche, la cartographie et la visualisation du graphe de code.
L’article de JoliCode explique comment un problème de performance dans une application Symfony a été diagnostiqué et résolu. Le composant Cache de Symfony, via son mécanisme de protection anti-stampede (peu documenté), a été identifié comme responsable de ralentissements inattendus, notamment dans une médiathèque d’administration et des endpoints d’API. Les symptômes incluaient des temps de réponse aléatoires et une première visite lente, sans lien avec le stockage ou les requêtes SQL.
Après avoir écarté plusieurs pistes (stockage, optimisations SQL), le diagnostic a révélé que le temps était perdu dans LockRegistry::compute, bloqué par des verrous (flock) liés au cache. Le problème, absent en préproduction, illustre les pièges des mécanismes de cache mal compris, même dans des environnements identiques.
La solution a consisté à ajuster la configuration du cache pour limiter l’impact de cette protection, évitant ainsi les attentes inutiles. L’article souligne l’importance du profilage en production pour identifier des causes contre-intuitives, plutôt que de se fier à des hypothèses.
Ce billet explique le fonctionnement des Core Web Vitals (LCP, INP, CLS) et leurs pièges, en insistant sur la mécanique de mesure plutôt que sur l'optimisation elle-même. Il détaille les seuils officiels (ex. LCP ≤ 2,5 s, INP ≤ 200 ms, CLS ≤ 0,1) et souligne deux nuances cruciales : l'évaluation repose sur le 75e percentile des sessions réelles (et non la moyenne) et une fenêtre d'observation de 28 jours glissants, rendant les corrections lentes à refléter. Les données proviennent principalement du CrUX (Chrome User Experience Report), limité aux utilisateurs de Chrome, ce qui exclut une partie significative du trafic (comme les utilisateurs Safari ou Firefox).
Blackfire permet de profiler du code PHP s'exécutant dans un consumer ou un worker (comme une commande Symfony en boucle), contrairement à l'usage classique déclenché via une requête HTTP. L'outil utilise les signaux POSIX pour activer ou désactiver le profilage à la volée, sans interrompre le processus en cours. Par exemple, un signal comme SIGUSR2 peut lancer le profilage, tandis qu'un autre signal (comme SIGTERM) l'arrête et génère le rapport.
L'article explique comment implémenter cette solution avec Symfony 5.2+, grâce à l'interface SignalableCommandInterface, qui simplifie la gestion des signaux sans recourir à pcntl_signal(). La commande doit définir les signaux à intercepter via getSubscribedSignals() et traiter les signaux reçus dans handleSignal(), en retournant false pour continuer l'exécution ou un code de sortie pour l'arrêter.
Pour activer Blackfire dans ce contexte, il faut d'abord l'installer via Composer (composer require blackfire/php-sdk). L'article souligne que cette approche est particulièrement utile pour analyser les performances de tâches en arrière-plan, comme la consommation de files de messages, sans avoir à modifier le code métier du consumer.
L’article explique les React Server Components (RSC) dans Next.js, une technologie qui sépare clairement le rendu côté serveur et côté client. L’idée centrale est de privilégier des composants "mort" (statiques, sans JavaScript) pour le contenu comme les articles ou les pieds de page, et des composants "vivants" (interactifs) uniquement pour les éléments nécessitant une interaction utilisateur. Cette approche réduit la taille des bundles et améliore les performances, tout en simplifiant la gestion des données (accès direct à la base de données côté serveur).
L’auteur partage son expérience en production, soulignant trois pièges courants : l’ajout excessif de directives "use client" qui alourdit inutilement le code client, les waterfalls de requêtes asynchrones ralentissant le rendu, et l’activation accidentelle du rendu dynamique via des fonctions comme cookies(). Il recommande de limiter les composants clients aux fonctionnalités indispensables et d’isoler les parties dynamiques pour conserver un rendu statique optimisé.
Enfin, l’article conseille d’adopter les RSC dès un nouveau projet Next.js, tandis que pour une application existante, une migration progressive des routes les plus lourdes (en termes de contenu) est préférable. L’auteur illustre ces principes avec son propre site, où les pages d’articles sont entièrement statiques, tandis que des fonctionnalités comme un chat ou des formulaires restent interactives.
L’article défend l’idée qu’SQLite, avec une configuration optimisée, peut remplacer des bases de données plus lourdes comme PostgreSQL pour de nombreux cas d’usage, même à grande échelle. Les auteurs ont testé cette hypothèse en construisant un réseau social (Chirp) avec 50 000 utilisateurs et un million de publications, stockés dans un seul fichier de 343 Mo. Toutes les tables étaient configurées en mode STRICT, et le backend reposait sur un seul processus Node.js sans serveur de base de données dédié.
Les benchmarks, réalisés sur un simple ordinateur portable (Apple M1), révèlent des performances impressionnantes : jusqu’à 315 millions de requêtes par jour sur l’endpoint le plus sollicité (la timeline), avec des temps de réponse médians de 13 ms. Même les opérations complexes, comme les jointures sur des millions de lignes, restent fluides grâce à des pragmas adaptés (WAL, cache optimisé, etc.). Les auteurs soulignent que ces résultats rendent superflus des outils comme les connection poolers pour la plupart des applications.
Cependant, l’article reconnaît aussi les limites de SQLite, notamment pour les charges de travail extrêmes ou nécessitant des fonctionnalités avancées (réplication multi-nœuds, requêtes analytiques complexes). En résumé, pour des applications classiques, SQLite en mode WAL offre une solution simple, performante et économique, sans compromis majeurs.
L’article de Victor Ayomipo, publié sur Smashing Magazine, remet en question la règle souvent absolue de ne jamais bloquer le fil principal (main thread) du navigateur en JavaScript. Bien que cette pratique soit généralement déconseillée pour éviter de figer l’interface utilisateur, l’auteur explique qu’il a dû y déroger lors du développement d’une extension Chrome de capture d’écran, Fastary. Malgré l’utilisation d’un Offscreen Document (un processus en arrière-plan), les opérations sur le canevas restaient lentes, parfois plus que si elles avaient été exécutées directement sur le fil principal.
L’argument central repose sur les limites des architectures recommandées, qui séparent strictement les tâches lourdes des opérations d’interface. L’auteur souligne que la communication entre les différents contextes (fil principal, Web Workers, Service Workers) peut introduire des latences supplémentaires, notamment lors de la sérialisation et désérialisation des données. Dans certains cas, comme celui de son extension, le transfert de travail vers un fil secondaire s’est avéré plus lent que de le laisser sur le fil principal.
Pour illustrer ce propos, l’article aborde brièvement l’architecture d’isolation des contextes du navigateur, expliquant comment les différents environnements (fil principal, Web Workers, etc.) communiquent entre eux. Cette analyse met en lumière les compromis inhérents aux bonnes pratiques en matière de performance, invitant les développeurs à évaluer au cas par cas l’opportunité de bloquer le fil principal.
Ce billet explique comment optimiser les performances d’un blog Symfony utilisant Doctrine et PostgreSQL 16 en analysant les requêtes avec l’outil EXPLAIN. L’auteur détaille l’utilisation de EXPLAIN (ANALYZE, BUFFERS) pour examiner les plans d’exécution, identifier des problèmes comme le N+1 masqué par le cache, et vérifier l’efficacité des index via pg_stat_user_indexes. Sur les 47 index de la base, seuls 14 sont réellement utilisés, illustrant l’importance de cibler les optimisations.
L’article montre comment interpréter les plans d’exécution, comme un Index Scan pour une requête par slug ou un Seq Scan inefficace pour une jointure de catégorie. Il souligne que PostgreSQL privilégie la stratégie la moins coûteuse, même si un index existe, et met en lumière des fonctionnalités comme Memoize pour éviter des lectures redondantes. L’analyse révèle aussi des requêtes mal optimisées, comme une jointure forçant un parcours complet de table.
Enfin, le billet insiste sur la nécessité de combiner EXPLAIN et les outils de profilage Symfony pour corriger les requêtes problématiques avant de vérifier en production. L’exemple concret du flux RSS démontre comment PostgreSQL optimise automatiquement certaines opérations, tout en rappelant que chaque index doit justifier son existence par une utilisation réelle.
Lea Verou défend l’utilité des polyfills dans un billet de blog, face à des critiques récentes suggérant qu’ils seraient néfastes pour le développement web. Elle rappelle que ces outils permettent de découpler la conception des API de leur implémentation, offrant ainsi une flexibilité essentielle aux développeurs tout en maintenant la compatibilité avec les standards émergents. Verou, experte en standards web et auteure de bibliothèques open source, souligne que les polyfills favorisent un écosystème plus robuste, inclusif et performant, malgré quelques cas problématiques où leur adoption prématurée a pu restreindre l’évolution des API natives.
Elle répond aux inquiétudes de certains éditeurs de spécifications, comme Anne van Kesteren (WHATWG), qui voient les polyfills comme un frein à la flexibilité des API. Verou argue que ces préoccupations, bien que légitimes, ignorent souvent les réalités pratiques du développement web, où les développeurs privilégient les solutions natives lorsqu’elles existent. Selon elle, les risques liés aux polyfills (comme les incompatibilités futures) sont comparables à ceux d’autres techniques de fallback, et leur interdiction totale serait contre-productive.
Enfin, Verou insiste sur l’importance de ne pas confondre les polyfills avec le problème sous-jacent : l’échec des processus de standardisation à anticiper les besoins des développeurs. Elle conclut que, plutôt que de chercher à éliminer les polyfills, il faudrait améliorer les mécanismes de collaboration entre éditeurs de spécifications et auteurs de bibliothèques pour éviter les conflits de conception.
L’article de Vincent Bernat illustre les dérives des indicateurs clés de performance (KPI) à travers son expérience chez Orange Portails, où l’obsession des chiffres a progressivement étouffé l’efficacité opérationnelle. Initialement, l’équipe bénéficiait d’un environnement technique optimal, avec des outils internes performants et une grande autonomie, favorisant l’innovation et la productivité. Cependant, la focalisation excessive sur des métriques a conduit à une dégradation des processus, illustrant la loi de Campbell selon laquelle les indicateurs finissent par être manipulés ou détournés de leur objectif initial.
L’auteur souligne que cette dérive a transformé une structure agile et réactive en un système bureaucratique, où les équipes passaient plus de temps à optimiser les KPI qu’à résoudre les problèmes réels. Cette situation rappelle l’"usine à clous soviétique", où la production était mesurée en quantité plutôt qu’en qualité, au détriment de l’efficacité globale. L’expérience de Bernat sert ainsi d’avertissement contre l’abus des indicateurs quantitatifs dans la gestion des projets et des équipes.