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.

Bu gönderiyi beğendiniz mi?
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
AdGuard VPN AdGuard DNS AdGuard Mail AdGuard Wallet
Windows için AdGuard'ın ana ekranı
Windows için AdGuard'ın koruma özelliklerini ve ayarlarını gösteren koruma ekranı
Windows için AdGuard'ın engellenen reklamların ve izleyicilerin istatistiklerini gösteren İstatistik ekranı
Windows için AdGuard'ın uygulama yönetimi ekranı, cihazda yüklü uygulamalar için koruma yönetimi seçeneklerini göstermektedir
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard: Windows için reklam engelleyici

Windows için AdGuard, bir reklam engelleyiciden daha fazlasıdır. Reklamları engelleyen, tehlikeli sitelere erişimi kontrol eden, sayfanın açılışını hızlandıran ve çocukları uygunsuz içerikten koruyan çok amaçlı bir araçtır
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Microsoft Mağazası
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Windows için AdGuard v8.0, 14 gün deneme süresi
Mac için AdGuard'ın ana ekranı
Mac için AdGuard'ın Gizlilik Modu ekranı
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard: Mac için reklam engelleyici

Mac için AdGuard, macOS düşünülerek tasarlanmış benzersiz bir reklam engelleyicidir. Sizi tarayıcılar ve uygulamalardaki rahatsız edici reklamlardan korumanın yanı sıra, izleme, kimlik avı ve dolandırıcılıktan da korur
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
Mac için AdGuard v2.19, 14 gün deneme süresi
Android için AdGuard'ın ana ekranı
Android için AdGuard'ın İzleme koruması ekranı
Android için AdGuard'ın uygulama yönetimi ekranı, cihazda yüklü uygulamalar için koruma yönetimi seçeneklerini göstermektedir
Android için AdGuard'ın engellenen reklamların ve izleyicilerin istatistiklerini gösteren İstatistik ekranı
Android için AdGuard'ın özel tarayıcısının ana ekranı
Android için AdGuard'ı indirme QR kodu
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard: Android için reklam engelleyici

Tüm tarayıcılarda, oyunlarda ve diğer uygulamalarda reklamları ve izleyicileri engeller. Gizliliğinizi korur ve uygulamalarınızın interneti nasıl kullandığını kontrol etmenizi sağlar. APK aracılığıyla yüklenir
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
İndirmek için tara
Cihazınızda bulunan herhangi bir QR kod okuyucuyu kullanın
Android için AdGuard v4.14, 14 gün deneme süresi
iOS için AdGuard'ın ana ekranı
iOS için AdGuard'ın koruma özelliklerini ve ayarlarını gösteren koruma ekranı
iOS için AdGuard'ın engellenen reklamların ve izleyicilerin istatistiklerini gösteren İstatistik ekranı
iOS için AdGuard'ı indirme QR kodu
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard: iOS için reklam engelleyici

iPhone ve iPad için en iyi iOS reklam engelleyici. AdGuard, Safari'de her türlü reklamı ve izleyiciyi ortadan kaldırır ve DNS düzeyinde tüm uygulamalarda gizliliğinizi korur
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
İndirmek için tara
Cihazınızda bulunan herhangi bir QR kod okuyucuyu kullanın
iOS için AdGuard v4.5
AdGuard İçerik Engelleyicinin ana ekranı
AdGuard İçerik Engelleyicinin Filtreler ekranı
AdGuard İçerik Engelleyicinin Ayarlar ekranı
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard İçerik Engelleyici

AdGuard Content Blocker, içerik engelleme teknolojisini destekleyen mobil tarayıcılarda her türlü reklamı ortadan kaldırır — örneğin, Samsung Internet ve Yandex Browser. Android için AdGuard'a kıyasla özellikleri sınırlıdır, ancak ücretsiz, yüklemesi kolay ve etkilidir
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
AdGuard İçerik Engelleyici v2.8
AdGuard Tarayıcı Uzantısı'nın ana ekranı
AdGuard Tarayıcı Uzantısı'nın İzleme koruması ekranı
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard Tarayıcı Uzantısı

AdGuard, tüm web sayfalarındaki tüm reklam türlerini etkili bir şekilde engelleyen en hızlı ve en hafif reklam engelleme uzantısıdır! Kullandığınız tarayıcı için AdGuard'ı seçin ve reklamsız, hızlı ve güvenli gezinmenin tadını çıkarın.
Yükle
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Yükle
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Yükle
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Yükle
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Yükle
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
Yükle
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
AdGuard Tarayıcı Uzantısı v5.5
AdGuard Asistanın ana ekranı
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard Asistanı

AdGuard masaüstü uygulamaları için bir yardımcı tarayıcı uzantısıdır. Bu uzantı, sitelerde özel öğeleri engellemenize, siteleri izin listesine eklemenize ve tarayıcınızdan doğrudan bildirimler göndermenize izin verir
AdGuard Asistanı v1.4
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard Home

AdGuard Home, reklamları ve izleyicileri engellemek için ağ tabanlı bir çözümdür. Ev ağınızdaki tüm cihazları kapsaması için yönlendiricinize bir kez kurun — ek istemci yazılımı gerekmez. Bu özellikle gizliliğinize tehdit oluşturan çeşitli IoT cihazları için önemlidir
AdGuard Home v0.107
iOS için AdGuard Pro'nun ana ekranı
iOS için AdGuard Pro'nun koruma özelliklerini ve ayarlarını gösteren Koruma ekranı
iOS için AdGuard Pro'nun İstatistikler ekranı, engellenen reklamlar ve izleyicilere ilişkin istatistikleri gösterir
21.371 21371 kullanıcı incelemesi
Mükemmel!

iOS için AdGuard Pro

AdGuard Pro for iOS, tüm gelişmiş reklam engelleme koruma özellikleri etkin olarak gelir. iOS için ücretli AdGuard sürümüyle aynı araçları sunar. Safari'de reklamları engellemede mükemmeldir ve korumanızı özelleştirmeniz için DNS ayarlarını kişiselleştirmenize olanak tanır. Tarayıcılar ve uygulamalarda reklamları engeller, çocuklarınızı uygunsuz içeriklerden korur ve kişisel verilerinizi güvenli tutar
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
iOS için AdGuard Pro v4.5
Mac için AdGuard Mini'nin ana ekranı
Mac için AdGuard Mini'nin Safari koruma ekranı
Mac için AdGuard Mini'nin kural oluşturma ekranı
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard Mini for Mac — Safari reklam engelleyici

Mac için AdGuard Mini, güçlü bir Safari reklam engelleyicisidir. Bu hafif uygulama reklamları kaldırır, izleyicileri engeller ve sayfa yüklemeyi hızlandırır. Safari'de Web'de dikkatiniz dağılmadan gezinmenize ve verilerinizi gizli tutmanıza yardımcı olur
Yükle
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
Mac için AdGuard Mini v2.3
Android TV için AdGuard'ın korumanın etkin olduğu ana ekranı
Android TV için AdGuard'ın özelliklerini ve ayarlarını gösteren Reklam Engelleme ekranı
Android TV için AdGuard'ın ayarlar ekranı
Android TV için AdGuard'ın reklamların ve izleyicilerin engellendiği uygulamaları gösteren Uygulama Yönetimi ekranı
21.371 21371 kullanıcı incelemesi
Mükemmel!

Android TV için AdGuard

Android TV için AdGuard, reklamları engelleyen, gizliliğinizi koruyan ve Akıllı TV'niz için bir güvenlik duvarı görevi gören tek uygulamadır. Web tehditleri hakkında uyarılar alın, güvenli DNS kullanın ve şifrelenmiş trafikten yararlanın. Birinci sınıf güvenlik; sıfır reklam ile rahatlayın ve en sevdiğiniz programlara dalın!
Android TV için AdGuard v4.14, 14 gün deneme süresi
Linux penguenini tutan AdGuard maskotu Agnar
21.371 21371 kullanıcı incelemesi
Mükemmel!

Linux için AdGuard

Linux için AdGuard, dünyanın ilk sistem genelinde Linux reklam engelleyicisidir. Reklamları ve izleyicileri cihaz düzeyinde engelleyin, önceden yüklenmiş filtrelerden seçim yapın veya kendi filtrenizi ekleyin — tüm bunları komut satırı arayüzü aracılığıyla gerçekleştirin
Linux için AdGuard v1.4
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard Temp Mail

Sizi anonim tutan ve gizliliğinizi koruyan ücretsiz bir geçici e-posta adresi oluşturucu. Ana gelen kutunuzda istenmeyen posta olmaz!
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard VPN

Dünya çapında 75 konum

Herhangi bir içeriğe erişim

Güçlü şifreleme

Günlük tutmama politikası

En hızlı bağlantı

7/24 destek

Ücretsiz dene
Programı indirerek Lisans sözleşmesi şartlarını kabul etmiş olursunuz
Devamını oku
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard DNS

AdGuard DNS, herhangi bir uygulamanın yüklenmesini gerektirmeyen internet reklamlarını engellemenin kusursuz bir yoludur. Kullanımı kolay, tamamen ücretsizdir, herhangi bir cihazda kolayca ayarlanır ve reklamları, sayaçları, kötü amaçlı siteleri ve yetişkinlere yönelik içeriği engellemek için gerekli minimum işlevleri sağlar.
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard Mail

Kimliğinizi koruyun, istenmeyen postadan kaçının; gelen kutunuzu takma adlarımız ve geçici e-posta adreslerimizle güvende tutun. Tüm işletim sistemleri için ücretsiz e-posta yönlendirme hizmetimizin ve uygulamalarımızın keyfini çıkarın
21.371 21371 kullanıcı incelemesi
Mükemmel!

AdGuard Wallet

Varlıklarınız üzerinde tam kontrol sağlayan güvenli ve özel bir kripto cüzdanı. Birden fazla cüzdanı yönetin ve saklamak, göndermek ve takas etmek için binlerce kripto para birimini keşfedin
AdGuard indiriliyor AdGuard'ı kurmak için okla gösterilen dosyaya tıklayın "Aç" öğesini seçin ve "Tamam" öğesine tıklayın, ardından dosyanın indirilmesini bekleyin. Açılan pencerede AdGuard simgesini "Uygulamalar" klasörüne sürükleyin. AdGuard'ı seçtiğiniz için teşekkür ederiz! "Aç" öğesini seçin ve "Tamam" öğesine tıklayın, ardından dosyanın indirilmesini bekleyin. Açılan pencerede "Kur" öğesine tıklayın. AdGuard'ı seçtiğiniz için teşekkür ederiz!
AdGuard'ı mobil cihazınıza yükleyin