adblock 0.8.8

Native Rust module for Adblock Plus syntax (e.g. EasyList, EasyPrivacy) filter parsing and matching.
Documentation
#![cfg(any())] // This attribute disables the entire module
use criterion::*;

use adblock::cosmetic_filter_cache::CosmeticFilterCache;
use adblock::lists::{parse_filters, FilterFormat};

#[path = "../tests/test_utils.rs"]
mod test_utils;
use test_utils::rules_from_lists;

fn by_hostname(c: &mut Criterion) {
    let mut group = c.benchmark_group("cosmetic-hostname-match");

    group.throughput(Throughput::Elements(1));
    group.sample_size(20);

    group.bench_function("easylist", move |b| {
        let rules = rules_from_lists(&["data/easylist.to/easylist/easylist.txt"]);
        let (_, cosmetic_filters) = parse_filters(&rules, false, FilterFormat::Standard);
        let cfcache = CosmeticFilterCache::from_rules(cosmetic_filters);
        b.iter(|| cfcache.hostname_cosmetic_resources("google.com"))
    });
    group.bench_function("many lists", move |b| {
        let rules = rules_from_lists(&[
            "data/easylist.to/easylist/easylist.txt",
            "data/easylist.to/easylistgermany/easylistgermany.txt",
            "data/uBlockOrigin/filters.txt",
            "data/uBlockOrigin/unbreak.txt",
        ]);
        let (_, cosmetic_filters) = parse_filters(&rules, false, FilterFormat::Standard);
        let cfcache = CosmeticFilterCache::from_rules(cosmetic_filters);
        b.iter(|| cfcache.hostname_cosmetic_resources("google.com"))
    });
    group.bench_function("complex_hostname", move |b| {
        let rules = rules_from_lists(&[
            "data/easylist.to/easylist/easylist.txt",
            "data/easylist.to/easylistgermany/easylistgermany.txt",
            "data/uBlockOrigin/filters.txt",
            "data/uBlockOrigin/unbreak.txt",
        ]);
        let (_, cosmetic_filters) = parse_filters(&rules, false, FilterFormat::Standard);
        let cfcache = CosmeticFilterCache::from_rules(cosmetic_filters);
        b.iter(|| cfcache.hostname_cosmetic_resources("ads.serve.1.domain.google.com"))
    });

    group.finish();
}

fn by_classes_ids(c: &mut Criterion) {
    let mut group = c.benchmark_group("cosmetic-class-id-match");

    group.throughput(Throughput::Elements(1));
    group.sample_size(20);

    group.bench_function("easylist", move |b| {
        let rules = rules_from_lists(&["data/easylist.to/easylist/easylist.txt"]);
        let (_, cosmetic_filters) = parse_filters(&rules, false, FilterFormat::Standard);
        let cfcache = CosmeticFilterCache::from_rules(cosmetic_filters);
        let exceptions = Default::default();
        b.iter(|| {
            cfcache.hidden_class_id_selectors(
                &["ad"],
                &["ad"],
                &exceptions,
            )
        })
    });
    group.bench_function("many lists", move |b| {
        let rules = rules_from_lists(&[
            "data/easylist.to/easylist/easylist.txt",
            "data/easylist.to/easylistgermany/easylistgermany.txt",
            "data/uBlockOrigin/filters.txt",
            "data/uBlockOrigin/unbreak.txt",
        ]);
        let (_, cosmetic_filters) = parse_filters(&rules, false, FilterFormat::Standard);
        let cfcache = CosmeticFilterCache::from_rules(cosmetic_filters);
        let exceptions = Default::default();
        b.iter(|| {
            cfcache.hidden_class_id_selectors(
                &["ad"],
                &["ad"],
                &exceptions,
            )
        })
    });
    group.bench_function("many matching classes and ids", move |b| {
        let rules = rules_from_lists(&[
            "data/easylist.to/easylist/easylist.txt",
            "data/easylist.to/easylistgermany/easylistgermany.txt",
            "data/uBlockOrigin/filters.txt",
            "data/uBlockOrigin/unbreak.txt",
        ]);
        let (_, cosmetic_filters) = parse_filters(&rules, false, FilterFormat::Standard);
        let cfcache = CosmeticFilterCache::from_rules(cosmetic_filters);
        let exceptions = Default::default();
        let class_list = [
            "block-bg-advertisement-region-1",
            "photobox-adbox",
            "headerad-720",
            "rscontainer",
            "rail-article-sponsored",
            "fbPhotoSnowboxAds",
            "sidebar_ad_module",
            "ad-728x90_forum",
            "commercial-unit-desktop-rhs",
            "sponsored-editorial",
            "rr-300x600-ad",
            "adfoot",
            "lads",
        ];
        let id_list = [
            "footer-adspace",
            "adsponsored_links_box",
            "lsadvert-top",
            "mn",
            "col-right-ad",
            "view_ads_bottom_bg_middle",
            "ad_468x60",
            "rightAdColumn",
            "content",
            "rhs_block",
            "center_col",
            "header",
            "advertisingModule160x600",
        ];
        b.iter(|| cfcache.hidden_class_id_selectors(&class_list, &id_list, &exceptions))
    });

    group.finish();
}

criterion_group!(cosmetic_benches, by_hostname, by_classes_ids,);
criterion_main!(cosmetic_benches);