Ten years in the wrong regex lane

Today I want to share the story of a couple of regular expressions — a tiny inaccuracy in them ended up costing the world more than 50 million hours of CPU time on iOS devices.

Disclaimer: this post is packed with technical details and might be a tough read if you don’t know how to code.

How content blockers work in Safari

First, let me explain how ad blockers in Safari actually work. The fact is, AdGuard on iOS relies on Safari’s built-in mechanism called Safari Content Blockers.

These days, there’s also support for an alternative approach — declarativeNetRequest (DNR), partially compatible with Chrome and Firefox. Interestingly enough, in Safari’s case, DNR rules are silently translated into Safari Content Blocker rules under the hood.

The very first version of AdGuard for iOS was released in October 2015, and right away we ran into a nasty problem. Historically, ad blockers have always used their own filtering rule syntax. It’s powerful and specifically designed for web filtering. Apple, however, introduced their own take on it, which was quite different from what the community was used to.

To jump ahead a little: when Chrome introduced declarativeNetRequest, they also went their own way. At least when it came to URL matching, their syntax was much closer to what we were familiar with.

Here’s an example of how a standard AdGuard rule gets converted into syntax supported by Safari:

Converting an AdGuard rule into a Safari-accepted rule

Notice what happens to the URL pattern. In AdGuard filters, we use a special wildcard-like syntax tailored specifically to URLs. The reason is simple: traditional regular expressions are too slow for this job.

Regular expressions

Safari Content Blockers, on the other hand, rely on regular expressions — although in a very stripped-down form, so that they can still be compiled into a structure that speeds up matching.

If you’re curious about the internals: Safari builds a DFA bytecode out of regex patterns, which is then executed by a custom interpreter: DFABytecodeInterpreter.cpp.

Regexps are more versatile than the standard ad blocker syntax. Unfortunately, that flexibility isn’t really relevant for web content filtering. What we get instead is very slow rule compilation that eats up resources, plus strict limits on how many rules filters can contain. We’ve written before about Safari’s issues, and most of them are still around.

Pattern conversion v1.0

So, back in 2015, we had to figure out how to convert AdGuard’s URL patterns into regexps that Safari would accept.

We faced two major tasks at the time.

First, we needed to cut down the total number of rules in the final set. Back then, Safari had a hard limit of 50,000 rules. (We described how we tackled this in our post about ad blocking in Safari).

By the way, the current limit has been raised to 150,000. However, due to process memory limits, you can only use around 60–80K in practice. We reported this to Apple a couple of times (Apple Feedback Assistant reports: FB19728743, FB13282146), but to no avail.

The second task was to ensure the regexps we generated were efficient enough to run fast and lightweight enough for iOS to compile them. In those days, we sometimes saw the system kill the com.apple.Safari.ContentBlockerLoader process because it consumed too many resources.

After a lot of manual testing, we settled on what seemed like the optimal conversion rules:

  • The symbol || (“start of URL”) became ^[htpsw]+://([a-z0-9-]\.)?
  • The symbol ^ (“separator”) became [/:&?]

We felt confident we’d done our homework, so we stopped worrying about it and left things as they were — for nearly ten years.

We were wrong

It all started with another bug report. The issue was that our standard conversion method slightly changed the semantics of the special || symbol. On iOS, it ended up matching only a single subdomain level, while in every other version of AdGuard it matched across all levels.

The simple fix was to use the regular expression originally suggested by the WebKit developers back in 2015 — the one we had dismissed as “non-optimal” at the time. But we were so sure of our choice back then that we didn’t even bother to recheck until recently.

The changes we should have made were dead simple:

  • Replace || with ^[^:]+://+([^:/]+\.)?
  • Replace ^ in most cases with [/:]

But was there really that much of a difference? Turns out — oh yes, there was.

Oh boy, how wrong we were

After swapping in the new regexps, we ran a couple of quick tests and the results blew us away. Rule loading speed in Safari didn’t just improve a little — it skyrocketed.

To put it in numbers: compiling the Tracking Protection filter in Safari became 5.5 times faster, and compiling the Base filter became 2.8 times faster.

And to make it more tangible, just take a look at the video below:

When you add up the number of AdGuard users over the past decade, and how many times the app had to recompile filters, the wasted CPU time comes out to at least 50 million extra hours on iOS devices.

I honestly feel ashamed about this mistake — especially knowing that the correct solution was staring us in the face the whole time. In hindsight, it’s clear that these new regexps were obviously going to compile and run faster than what we had chosen.

So what exactly was our mistake back then? I think it all comes down to a flawed testing methodology. We tried to judge “by eye,” instead of:

  1. Defining a clear set of criteria: memory usage, speed, and actual content blocker performance in the browser.
  2. Most importantly: learning how to measure those things precisely. Not by eyeballing Activity Monitor or top, but by using a proper profiler.

The good news is, this problem is now fixed. And I really hope we’ve learned the lessons we needed to, so we won’t repeat mistakes like this in the future.

Vond je dit bericht leuk?
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
Het hoofdscherm van AdGuard voor Windows
Het beschermingsscherm van AdGuard voor Windows, met de beschermingsfuncties en -instellingen
Het statistiekenscherm van AdGuard voor Windows, met statistieken over geblokkeerde advertenties en volgers
Het appbeheerscherm van AdGuard voor Windows, met de opties voor beschermingsbeheer van apps die op het apparaat zijn geïnstalleerd
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard voor Windows: advertentieblokker voor pc

AdGuard voor Windows is meer dan een advertentieblokker. Het is een multifunctioneel hulpmiddel dat advertenties blokkeert, de toegang tot gevaarlijke sites regelt, het laden van pagina's versnelt en kinderen beschermt tegen ongepaste inhoud
Door het programma te downloaden accepteer je de licentievoorwaarden
Microsoft Store
Door het programma te downloaden accepteer je de licentievoorwaarden
AdGuard voor Windows v8.0, 14 dagen proefperiode
Het hoofdscherm van AdGuard voor Mac
Het Incognitomodus-scherm van AdGuard voor Mac
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard voor Mac: systeembrede advertentieblokker

AdGuard voor Mac is een unieke advertentieblokker die is ontworpen met macOS in gedachten. Het beschermt je niet alleen tegen vervelende advertenties in browsers en apps, maar beschermt je ook tegen volgen, phishing en fraude
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
AdGuard voor Mac v2.19, 14 dagen proefperiode
Het hoofdscherm van AdGuard voor Android
Het scherm 'Bescherming tegen volgers' van AdGuard voor Android
Het appbeheerscherm van AdGuard voor Android, met de opties voor beschermingsbeheer voor apps die op het apparaat zijn geïnstalleerd
Het statistiekenscherm van AdGuard voor Android, met statistieken over geblokkeerde advertenties en volgers
Het hoofdscherm van de privébrowser van AdGuard voor Android
De QR-code om AdGuard voor Android te downloaden
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard voor Android: advertentieblokker voor alle apps

Blokkeert advertenties en volgers in alle browsers, spellen en andere apps. Beschermt je privacy en geeft je controle over hoe jouw apps internet gebruiken. Geïnstalleerd via APK
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
Scannen om te downloaden
Gebruik een QR-codelezer die beschikbaar is op je apparaat
AdGuard voor Android v4.14, 14 dagen proefperiode
Het hoofdscherm van AdGuard voor iOS
Het beschermingsscherm van AdGuard voor iOS, dat de beschermingsfuncties en -instellingen toont.
Het statistiekenscherm van AdGuard voor iOS, met statistieken over geblokkeerde advertenties en volgers
De QR-code om AdGuard voor iOS te downloaden
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard: advertentieblokker voor iOS

De beste advertentieblokker voor iOS op iPhone en iPad. AdGuard verwijdert alle soorten advertenties en volgers in Safari en beschermt je privacy in alle apps op DNS-niveau
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
Scannen om te downloaden
Gebruik een QR-codelezer die beschikbaar is op je apparaat
AdGuard voor iOS v4.5
Het hoofdscherm van AdGuard Inhoudsblokker
Het filterscherm van AdGuard Inhoudsblokker
Het instellingenscherm van AdGuard Inhoudsblokker
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Content Blocker

AdGuard Content Blocker elimineert allerlei soorten advertenties in mobiele browsers die technologie voor het blokkeren van inhoud ondersteunen, namelijk Samsung Internet en Yandex Browser. De functies zijn beperkt in vergelijking met AdGuard voor Android, maar het is gratis, eenvoudig te installeren en efficiënt
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
AdGuard Content Blocker v2.8
Het hoofdscherm van de AdGuard-browseruitbreiding
Het scherm 'Bescherming tegen volgers' van AdGuard-browseruitbreiding
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Browserextensie

AdGuard is de snelste en lichtste advertentieblokkering uitbreiding die alle soorten advertenties op alle webpagina's effectief blokkeert! Kies AdGuard voor uw browser om advertentievrij, snel en veilig te surfen.
Installeren
Door het programma te downloaden accepteer je de licentievoorwaarden
Installeren
Door het programma te downloaden accepteer je de licentievoorwaarden
Installeren
Door het programma te downloaden accepteer je de licentievoorwaarden
Installeren
Door het programma te downloaden accepteer je de licentievoorwaarden
Installeren
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
Installeren
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
AdGuard Browserextensie v5.5
Het hoofdscherm van AdGuard Assistant
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Assistant

Een bijbehorende browseruitbreiding voor AdGuard desktop-apps. Het stelt je in staat om aangepaste items op websites te blokkeren, websites toe te voegen aan de toelatingslijst en rapporten rechtstreeks vanuit je browser te versturen
AdGuard Assistant v1.4
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Home

AdGuard Home is een netwerkgebaseerde oplossing voor het blokkeren van advertenties en volgers. Installeer het één keer op je router om alle apparaten in je thuisnetwerk te beschermen — geen extra clientsoftware vereist. Dit is vooral belangrijk voor verschillende IoT-apparaten die vaak een bedreiging vormen voor je privacy
AdGuard Home v0.107
Het hoofdscherm van AdGuard Pro voor iOS
Het beschermingsscherm van AdGuard Pro voor iOS, met de beschermingsfuncties en instellingen
Het statistiekenscherm van AdGuard Pro voor iOS, met statistieken over geblokkeerde advertenties en trackers
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Pro voor iOS

AdGuard Pro voor iOS wordt geleverd met alle geavanceerde beschermingsfuncties voor het blokkeren van advertenties. Het biedt dezelfde tools als de betaalde versie van AdGuard voor iOS. Het blinkt uit in het blokkeren van advertenties in Safari en laat je DNS-instellingen aanpassen om je bescherming aan te passen. Het blokkeert advertenties in browsers en apps, beschermt je kinderen tegen ongepaste inhoud en houdt je persoonlijke gegevens veilig
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
AdGuard Pro voor iOS v4.5
Het hoofdscherm van AdGuard Mini voor Mac
Het Safari-beschermingsscherm van AdGuard Mini voor Mac
Het 'Regel aanmaken'-scherm van AdGuard Mini voor Mac
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Mini voor Mac — Safari-advertentieblokker

AdGuard Mini voor Mac is een krachtige Safari-advertentieblokker. Deze lichtgewicht app verwijdert advertenties, blokkeert volgers en versnelt het laden van pagina's. Het helpt je om in Safari zonder afleiding op het web te surfen en je gegevens privé te houden
Installeren
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
AdGuard Mini voor Mac v2.3
Het hoofdscherm van AdGuard voor Android TV met ingeschakelde bescherming
Het advertentieblokkeringsscherm van AdGuard voor Android TV, met zijn functies en instellingen
Het instellingenscherm van AdGuard voor Android TV
Het appbeheer-scherm van AdGuard voor Android TV, waarop de apps worden getoond waar advertenties en volgers worden geblokkeerd
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard voor Android TV

AdGuard voor Android TV is de enige app die advertenties blokkeert, jouw privacy bewaakt en fungeert als firewall voor je Smart TV. Ontvang waarschuwingen over webbedreigingen, gebruik veilige DNS en profiteer van gecodeerd verkeer. Ontspan en duik in je favoriete programma's met eersteklas beveiliging en zonder advertenties!
AdGuard voor Android TV v4.14, 14 dagen proefperiode
De AdGuard-mascotte, Agnar, houdt de Linux-pinguïn vast
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard voor Linux

AdGuard voor Linux is 's werelds eerste systeem-brede AdGuard Advertentieblokker. Blokkeer advertenties en volgers op apparaatsniveau, kies uit vooraf geïnstalleerde filters, of voeg je eigen toe - allemaal via de interface
AdGuard voor Linux v1.4
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Temp Mail

Een gratis tijdelijke e-mailadresgenerator die je anoniem houdt en jouw privacy beschermt. Geen spam in je hoofdinbox!
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard VPN

75 locaties wereldwijd

Toegang tot alle inhoud

Sterke versleuteling

Geen logboekregistratie

Snelste verbinding

24/7 ondersteuning

Gratis proberen
Door het programma te downloaden accepteer je de licentievoorwaarden
Meer lezen
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard DNS

AdGuard DNS is een alternatieve oplossing voor advertentieblokkering, privacybescherming en ouderlijk toezicht. Het is eenvoudig in te stellen en gratis te gebruiken, biedt een minimum aan optimale bescherming tegen online advertenties, volgers en phishing, ongeacht welk platform en welk apparaat je gebruikt.
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Mail

Bescherm je identiteit, vermijd spam en houd je Postvak IN veilig met onze aliassen en tijdelijke e-mailadressen. Geniet van onze gratis service voor het doorsturen van e-mail en apps voor alle besturingssystemen
20.556 20556 gebruikersbeoordelingen
Uitstekend!

AdGuard Wallet

Een veilige en privé crypto-wallet die je volledige controle geeft over jouw activa. Beheer meerdere wallets en ontdek duizenden cryptocurrencies om op te slaan, te verzenden en te ruilen
Downloaden AdGuard Klik op het door de pijl aangegeven bestand om AdGuard te installeren. Selecteer "Open" en klik op "OK" - wacht even tot het bestand gedownload is. Sleep dan in het geopende venster het AdGuard icoontje naar de "Applications" map. Dank u dat u voor AdGuard gekozen heeft. Selecteer "Open" en klik op "OK" - wacht even tot het bestand gedownload is. Klik dan in het geopende venster op "Installeren". Dank u dat u voor AdGuard gekozen heeft.
AdGuard op je mobiele apparaat installeren