Une modification qui a accéléré le chargement des règles de filtrage dans Safari jusqu'à 5 fois

Aujourd'hui, je voudrais vous raconter l'histoire de deux expressions régulières : une petite imprécision dans celles-ci a fini par coûter au monde plus de 50 millions d'heures de temps CPU sur les appareils iOS.

Attention : cet article est plein de détails techniques et peut être difficile à suivre si vous ne savez pas coder.

Le fonctionnement des bloqueurs de contenu dans Safari

Tout d'abord, permettez-moi de vous expliquer comment fonctionnent les bloqueurs de publicités dans Safari. En réalité, AdGuard sur iOS s'appuie sur le mécanisme intégré à Safari appelé Safari Content Blockers.

De nos jours, il existe également une approche alternative prise en charge : declarativeNetRequest (DNR), partiellement compatible avec Chrome et Firefox. Il est intéressant de noter que dans le cas de Safari, les règles DNR sont discrètement traduites en règles Safari Content Blocker en arrière-plan.

La toute première version d'AdGuard pour iOS a été lancée en octobre 2015, et nous avons immédiatement rencontré un problème épineux. Historiquement, les bloqueurs de publicités ont toujours utilisé leur propre syntaxe de règles de filtrage. Elle est puissante et spécialement conçue pour le filtrage Web. Apple, cependant, a introduit sa propre version, très différente de celle à laquelle la communauté était habituée.

Avançons un peu : lorsque Chrome a introduit declarativeNetRequest, ils ont également suivi leur propre voie. Au moins en ce qui concerne la correspondance d'URL, leur syntaxe était beaucoup plus proche de celle que nous connaissions.

Voici un exemple de conversion d'une règle AdGuard standard en syntaxe prise en charge par Safari :

Conversion d'une règle AdGuard en une règle acceptée par Safari

Remarquez ce qui arrive au modèle d'URL. Dans les filtres AdGuard, nous utilisons une syntaxe spéciale de type joker spécialement adaptée aux URL. La raison est simple : les expressions régulières traditionnelles sont trop lentes pour cette tâche.

Expressions régulières

Les bloqueurs de contenu Safari, quant à eux, s'appuient sur des expressions régulières, bien que sous une forme très simplifiée, afin de pouvoir être compilés dans une structure qui accélère la correspondance.

Si vous souhaitez en savoir plus sur le fonctionnement interne : Safari crée un bytecode DFA à partir de modèles d'expressions régulières, qui est ensuite exécuté par un interpréteur personnalisé : DFABytecodeInterpreter.cpp.

Les expressions régulières sont plus polyvalentes que la syntaxe standard des bloqueurs de publicités. Malheureusement, cette flexibilité n'est pas vraiment pertinente pour le filtrage de contenu web. Au lieu de cela, nous obtenons une compilation de règles très lente qui consomme des ressources, ainsi que des limites strictes sur le nombre de règles que les filtres peuvent contenir. Nous avons déjà écrit un article sur les problèmes de Safari, et la plupart d'entre eux persistent.

Conversion des modèles v1.0

En 2015, nous avons dû trouver un moyen de convertir les modèles d'URL d'AdGuard en expressions régulières acceptées par Safari.

Nous étions alors confrontés à deux tâches majeures.

Tout d'abord, nous devions réduire le nombre total de règles dans l'ensemble final. À l'époque, Safari avait une limite stricte de 50 000 règles. (Nous avons décrit comment nous avons résolu ce problème dans notre article sur le blocage des publicités dans Safari).

À propos, la limite actuelle a été portée à 150 000. Cependant, en raison des limites de mémoire du processus, vous ne pouvez en utiliser qu'environ 60 à 80 000 dans la pratique. Nous avons signalé ce problème à Apple à plusieurs reprises (rapports Apple Feedback Assistant : FB19728743, FB13282146), mais en vain.

La deuxième tâche consistait à s'assurer que les expressions régulières que nous générions étaient suffisamment efficaces pour fonctionner rapidement et suffisamment légères pour que iOS puisse les compiler. À l'époque, nous avons parfois vu le système tuer le processus « com.apple.Safari.ContentBlockerLoader » parce qu'il consommait trop de ressources.

Après de nombreux tests manuels, nous avons arrêté notre choix sur ce qui semblait être les règles de conversion optimales :

  • Le symbole || (« début de l'URL ») est devenu ^[htpsw]+://([a-z0-9-]\.)?
  • Le symbole ^ (« séparateur ») est devenu [/:&?]

Nous étions convaincus d'avoir bien fait notre travail, alors nous avons cessé de nous en préoccuper et avons laissé les choses telles quelles pendant près de dix ans.

Nous avions tort

Tout a commencé avec un autre rapport de bogue. Le problème était que notre méthode de conversion standard modifiait légèrement la sémantique du symbole spécial ||. Sur iOS, il ne correspondait finalement qu'à un seul niveau de sous-domaine, alors que dans toutes les autres versions d'AdGuard, il correspondait à tous les niveaux.

La solution simple consistait à utiliser l'expression régulière initialement suggérée par les développeurs de WebKit en 2015, celle que nous avions rejetée à l'époque comme « non optimale ». Mais nous étions tellement sûrs de notre choix à l'époque que nous n'avons même pas pris la peine de le revérifier jusqu'à récemment.

Les modifications que nous aurions dû apporter étaient extrêmement simples :

  • Remplacer || par ^[^:]+://+([^:/]+\.)?
  • Remplacer ^ dans la plupart des cas par [/:]

Mais y avait-il vraiment une telle différence ? Il s'avère que oui, il y en avait une.

Oh là là, comme nous avions tort !

Après avoir remplacé les nouvelles expressions régulières, nous avons effectué quelques tests rapides et les résultats nous ont époustouflés. La vitesse de chargement des règles dans Safari ne s'est pas seulement améliorée, elle a explosé.

En chiffres : la compilation du filtre de protection contre le pistage dans Safari est devenue 5,5 fois plus rapide, et celle du filtre de base 2,8 fois plus rapide.

Pour vous donner une idée plus concrète, regardez la vidéo ci-dessous :

Si l'on additionne le nombre d'utilisateurs d'AdGuard au cours de la dernière décennie et le nombre de fois où l'application a dû recompiler les filtres, le temps CPU gaspillé s'élève à au moins 50 millions d'heures supplémentaires sur les appareils iOS.

Je suis sincèrement honteux de cette erreur, d'autant plus que la solution correcte était sous nos yeux depuis le début. Avec le recul, il est évident que ces nouvelles expressions régulières allaient être compilées et exécutées plus rapidement que celles que nous avions choisies.

Alors, quelle a été notre erreur à l'époque ? Je pense que tout repose sur une méthodologie de test défaillante. Nous avons essayé de juger « à l'œil nu », au lieu de :

  1. Définir un ensemble de critères clairs : utilisation de la mémoire, vitesse et performances réelles du bloqueur de contenu dans le navigateur.
  2. Et surtout : apprendre à mesurer ces éléments avec précision. Non pas en observant Activity Monitor ou top, mais en utilisant un profileur approprié.

La bonne nouvelle, c'est que ce problème est désormais résolu. Et j'espère vraiment que nous en avons tiré les leçons nécessaires, afin de ne plus répéter ce genre d'erreurs à l'avenir.

Vous avez aimé cet article ?
21 044 21044 avis
Excellent !

AdGuard pour Windows

AdGuard pour Windows est plus qu'un bloqueur de publicités. Il s'agit d'un outil polyvalent qui bloque les publicités, contrôle l'accès aux sites dangereux, accélère le chargement des pages et protège les enfants contre les contenus inappropriés.
En téléchargeant le programme, vous acceptez les termes des Conditions générales d'utilisation
En savoir plus
AdGuard pour Windows v 7.21, période d'essai de 14 jours
21 044 21044 avis
Excellent !

AdGuard pour Mac

AdGuard pour Mac est un bloqueur de publicité unique conçu pour macOS. En plus de vous protéger contre les publicités gênantes dans les navigateurs et les applications, il vous protège contre le pistage, l'hameçonnage et la fraude.
En téléchargeant le programme, vous acceptez les termes des Conditions générales d'utilisation
En savoir plus
AdGuard pour Mac v 2.17, période d'essai de 14 jours
21 044 21044 avis
Excellent !

AdGuard pour Android

AdGuard pour Android est la solution parfaite pour les appareils sur Android. Contrairement à la plupart des autres bloqueurs de publicité, AdGuard ne nécessite pas d'accès root et offre un large éventail d'options de gestion des applications.
En téléchargeant le programme, vous acceptez les termes des Conditions générales d'utilisation
En savoir plus
Scanner pour télécharger
Utilisez n'importe quel lecteur de code QR disponible sur votre appareil.
AdGuard pour Android v 4.11, période d'essai de 14 jours
21 044 21044 avis
Excellent !

AdGuard pour iOS

Le meilleur bloqueur de publicités iOS pour iPhone et iPad. AdGuard élimine tous les types de publicités dans Safari, protège votre vie privée et accélère le chargement des pages. La technologie de blocage publicitaire d'AdGuard pour iOS garantit un filtrage de la plus haute qualité et vous permet d'utiliser plusieurs filtres en même temps
En téléchargeant le programme, vous acceptez les termes des Conditions générales d'utilisation
En savoir plus
Scanner pour télécharger
Utilisez n'importe quel lecteur de code QR disponible sur votre appareil.
AdGuard pour iOS v4.5
21 044 21044 avis
Excellent !

Bloqueur de contenu AdGuard

Le Bloqueur de contenus AdGuard supprime tous les types de publicités dans les navigateurs mobiles compatibles avec la technologie de blocage de contenu, notamment Samsung Internet et Yandex. Ses fonctionnalités sont limitées par rapport à AdGuard pour Android, mais il est gratuit, facile à installer et efficace
En téléchargeant le programme, vous acceptez les termes des Conditions générales d'utilisation
En savoir plus
Bloqueur de contenu AdGuard v2.8
21 044 21044 avis
Excellent !

Extension de navigateur AdGuard

AdGuard est l'extension bloqueuse de pub la plus souple et rapide qui bloque tous les types de pub sur toutes les pages Web! Selectionnez le module AdGuard pour votre type de navigateur préféré et surfez le web en toute sécurité et sans publicité.
Extension de navigateur AdGuard v5.1
21 044 21044 avis
Excellent !

Assistant AdGuard

Une extension de navigateur compagnon pour les applications pour ordinateur AdGuard. Elle offre un accès depuis le navigateur au blocage personnalisé d'éléments, à l'ajout de sites Web à la liste blanche et au signalement de bogue quelconque.
Assistant AdGuard v1.4
21 044 21044 avis
Excellent !

AdGuard Home

AdGuard Home est une solution réseau qui bloque les publicités et les traqueurs. Installez-la une fois sur votre routeur pour protéger tous les appareils de votre réseau domestique ; aucun logiciel client supplémentaire n'est requis. Ceci est particulièrement important pour les différents objets connectés qui représentent souvent une menace pour votre vie privée
AdGuard Home v0.107
21 044 21044 avis
Excellent !

AdGuard Pro pour iOS

AdGuard Pro pour iOS intègre toutes les fonctionnalités avancées de blocage des publicités. Il offre les mêmes outils que la version payante de AdGuard pour iOS. Il excelle dans le blocage des annonces dans Safari et vous permet de personnaliser vos paramètres DNS pour une protection sur mesure. Il bloque les publicités dans les navigateurs et les applications, protège vos enfants des contenus inappropriés et protège vos données personnelles
En téléchargeant le programme, vous acceptez les termes des Conditions générales d'utilisation
En savoir plus
AdGuard Pro pour iOS v4.5
21 044 21044 avis
Excellent !

AdGuard pour Safari

Au moment ou Apple a décidé de forcer tout le monde à utiliser son SDK, les extensions bloqueuses de pub pour Safari sont entrés dans une période difficile. L'extension AdGuard doit ramener le blocage des pubs dans Safari au top.
AdGuard pour Safari v1.11
21 044 21044 avis
Excellent !

AdGuard pour Android TV

AdGuard pour Android TV est la seule application qui bloque les publicités, protège votre vie privée et agit comme un pare-feu pour votre Smart TV. Recevez des avertissements sur les menaces web, utilisez des DNS sécurisés et bénéficiez d'un trafic chiffré. Détendez-vous et plongez dans vos émissions préférées avec une sécurité de premier ordre et zéro publicité !
AdGuard pour Android TV v 4.11, période d'essai de 14 jours
21 044 21044 avis
Excellent !

AdGuard pour Linux

AdGuard pour Linux est le premier bloqueur d'annonces sous Linux à l'échelle du système. Bloquez les publicités et les traqueurs au niveau de l'appareil, choisissez parmi les filtres préinstallés ou ajoutez les vôtres — le tout via l'interface de ligne de commande
AdGuard pour Linux v1.0
21 044 21044 avis
Excellent !

AdGuard Temp Mail

Un générateur d'adresses e-mail temporaires gratuit qui vous permet de rester anonyme et de protéger votre vie privée. Pas de spam dans votre boîte de réception principale !
21 044 21044 avis
Excellent !

AdGuard VPN

66 localisations dans le monde entier

Accès à tous types de contenu

Chiffrement fort

Politique sans journalisation

Connexion ultra-rapide

Support 24/7

Essai gratuit
En téléchargeant le programme, vous acceptez les termes des Conditions générales d'utilisation
En savoir plus
21 044 21044 avis
Excellent !

DNS AdGuard

AdGuard DNS est une solution infaillible qui bloque les publicités et n'a pas besoin d'installer d'autres applications. Facile à configurer et à utiliser, elle offre le minimum de protection nécessaire contre les publicités en ligne, les systémes de suivi et d'hameçonnage, et le contenu pour adultes.
21 044 21044 avis
Excellent !

AdGuard Mail

Protégez votre identité, évitez le spam et protégez votre boîte de réception grâce à nos alias et adresses e-mail temporaires. Profitez de notre service gratuit de transfert d'e-mails et de nos applications pour tous les systèmes d'exploitation
21 044 21044 avis
Excellent !

AdGuard Wallet

Un portefeuille crypto sécurisé et privé qui vous offre un contrôle total sur vos actifs. Gérez plusieurs portefeuilles et découvrez des milliers de cryptomonnaies à stocker, envoyer et échanger
Téléchargement de AdGuard Pour installer AdGuard, cliquez le fichier indiqué par la flèche Sélectionnez « Ouvrir » et cliquez sur « OK », puis attendez que le fichier soit téléchargé. Dans la fenêtre ouverte, faites glisser l'icône AdGuard dans le dossier « Applications ». Merci d'avoir choisi AdGuard! Sélectionnez « Ouvrir » et cliquez sur « OK », puis attendez que le fichier soit téléchargé. Dans la fenêtre ouverte, cliquez sur « Installer ». Merci d'avoir choisi AdGuard!
Installer AdGuard sur votre appareil mobile