https-dns 0.2.0

Minimal and efficient DNS-over-HTTPS (DoH) client
Documentation
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use https_dns::cache::Cache;
use std::net::Ipv4Addr;
use tokio::runtime::Builder;
use trust_dns_proto::{
    op::{Message, Query},
    rr::{Name, RData, Record, RecordType},
};

async fn cache() {
    let cache = &Cache::new();

    let mut handle_list = Vec::new();
    for i in 0..10000 {
        let mut cache = cache.clone();
        let handle = tokio::spawn(async move {
            let mut query = Query::new();
            let name: Name = format!("{i}.example.com").parse().unwrap();
            query.set_name(name.clone());

            let mut answer = Record::with(name, RecordType::A, 1440);
            answer.set_data(Some(RData::A(Ipv4Addr::new(1, 1, 1, 1))));

            let mut response_message = Message::new();
            response_message.add_query(query.clone());
            response_message.add_answer(answer.clone());
            cache.put(black_box(response_message));

            let mut request_message = Message::new();
            request_message.add_query(query.clone());
            cache.get(black_box(&request_message));
        });
        handle_list.push(handle);
    }

    for handle in handle_list {
        handle.await.unwrap();
    }
}

fn criterion_benchmark(c: &mut Criterion) {
    let runtime = Builder::new_multi_thread().enable_all().build().unwrap();
    c.bench_function("cache", |b| b.to_async(&runtime).iter(cache));
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);