Add bench for match_url and clean up some gross benchmark boilerplate
This commit is contained in:
Родитель
d1b0d7b05f
Коммит
2b6bc29821
|
@ -55,5 +55,5 @@ name = "match_impl"
|
||||||
harness = false
|
harness = false
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
name = "search_frecent"
|
name = "search"
|
||||||
harness = false
|
harness = false
|
|
@ -0,0 +1,99 @@
|
||||||
|
use criterion::{criterion_group, criterion_main, Criterion};
|
||||||
|
|
||||||
|
use places::api::matcher::{match_url, search_frecent, SearchParams};
|
||||||
|
use places::PlacesDb;
|
||||||
|
use std::rc::Rc;
|
||||||
|
use tempdir::TempDir;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, serde_derive::Deserialize)]
|
||||||
|
struct DummyHistoryEntry {
|
||||||
|
url: String,
|
||||||
|
title: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_db(db: &mut PlacesDb) -> places::Result<()> {
|
||||||
|
let dummy_data = include_str!("../fixtures/dummy_urls.json");
|
||||||
|
let entries: Vec<DummyHistoryEntry> = serde_json::from_str(dummy_data)?;
|
||||||
|
let tx = db.db.transaction()?;
|
||||||
|
let day_ms = 24 * 60 * 60 * 1000;
|
||||||
|
let now: places::Timestamp = std::time::SystemTime::now().into();
|
||||||
|
for entry in entries {
|
||||||
|
let url = url::Url::parse(&entry.url).unwrap();
|
||||||
|
for i in 0..20 {
|
||||||
|
let obs = places::VisitObservation::new(url.clone())
|
||||||
|
.with_title(entry.title.clone())
|
||||||
|
.with_is_remote(i < 10)
|
||||||
|
.with_visit_type(places::VisitTransition::Link)
|
||||||
|
.with_at(places::Timestamp(now.0 - day_ms * (1 + i)));
|
||||||
|
places::storage::history::apply_observation_direct(&tx, obs)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tx.commit()?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct TestDb {
|
||||||
|
// Needs to be here so that the dir isn't deleted.
|
||||||
|
_dir: TempDir,
|
||||||
|
pub db: PlacesDb,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestDb {
|
||||||
|
pub fn new() -> Rc<Self> {
|
||||||
|
let dir = TempDir::new("placesbench").unwrap();
|
||||||
|
let file = dir.path().join("places.sqlite");
|
||||||
|
let mut db = PlacesDb::open(&file, None).unwrap();
|
||||||
|
println!("Populating test database...");
|
||||||
|
init_db(&mut db).unwrap();
|
||||||
|
println!("Done populating test db");
|
||||||
|
Rc::new(Self { _dir: dir, db })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! db_bench {
|
||||||
|
($c:expr, $name:literal, |$db:ident = $test_db_name:ident| $expr:expr) => {{
|
||||||
|
let $test_db_name = $test_db_name.clone();
|
||||||
|
$c.bench_function($name, move |b| {
|
||||||
|
let $db = &$test_db_name.db;
|
||||||
|
b.iter(|| $expr)
|
||||||
|
});
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bench_search_frecent(c: &mut Criterion) {
|
||||||
|
let test_db = TestDb::new();
|
||||||
|
db_bench!(c, "search_frecent string", |db = test_db| {
|
||||||
|
search_frecent(&db, SearchParams {
|
||||||
|
search_string: "mozilla".into(),
|
||||||
|
limit: 10,
|
||||||
|
}).unwrap()
|
||||||
|
});
|
||||||
|
db_bench!(c, "search_frecent origin", |db = test_db| {
|
||||||
|
search_frecent(&db, SearchParams {
|
||||||
|
search_string: "blog.mozilla.org".into(),
|
||||||
|
limit: 10,
|
||||||
|
}).unwrap()
|
||||||
|
});
|
||||||
|
db_bench!(c, "search_frecent url", |db = test_db| {
|
||||||
|
search_frecent(&db, SearchParams {
|
||||||
|
search_string: "https://hg.mozilla.org/mozilla-central".into(),
|
||||||
|
limit: 10,
|
||||||
|
}).unwrap()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bench_match_url(c: &mut Criterion) {
|
||||||
|
let test_db = TestDb::new();
|
||||||
|
db_bench!(c, "match_url string", |db = test_db| {
|
||||||
|
match_url(&db, "mozilla").unwrap()
|
||||||
|
});
|
||||||
|
db_bench!(c, "match_url origin", |db = test_db| {
|
||||||
|
match_url(&db, "blog.mozilla.org").unwrap()
|
||||||
|
});
|
||||||
|
db_bench!(c, "match_url url", |db = test_db| {
|
||||||
|
match_url(&db, "https://hg.mozilla.org/mozilla-central").unwrap()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
criterion_group!(benches, bench_search_frecent, bench_match_url);
|
||||||
|
criterion_main!(benches);
|
|
@ -1,79 +0,0 @@
|
||||||
use criterion::{criterion_group, criterion_main, Criterion};
|
|
||||||
|
|
||||||
use places::api::matcher::{search_frecent, SearchParams};
|
|
||||||
use places::PlacesDb;
|
|
||||||
use std::rc::Rc;
|
|
||||||
use tempdir::TempDir;
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, serde_derive::Deserialize)]
|
|
||||||
struct DummyHistoryEntry {
|
|
||||||
url: String,
|
|
||||||
title: String,
|
|
||||||
}
|
|
||||||
fn init_db(db: &mut PlacesDb) -> places::Result<()> {
|
|
||||||
let dummy_data = include_str!("../fixtures/dummy_urls.json");
|
|
||||||
let entries: Vec<DummyHistoryEntry> = serde_json::from_str(dummy_data)?;
|
|
||||||
let tx = db.db.transaction()?;
|
|
||||||
let day_ms = 24 * 60 * 60 * 1000;
|
|
||||||
let now: places::Timestamp = std::time::SystemTime::now().into();
|
|
||||||
for entry in entries {
|
|
||||||
let url = url::Url::parse(&entry.url).unwrap();
|
|
||||||
for i in 0..20 {
|
|
||||||
let obs = places::VisitObservation::new(url.clone())
|
|
||||||
.with_title(entry.title.clone())
|
|
||||||
.with_is_remote(i < 10)
|
|
||||||
.with_visit_type(places::VisitTransition::Link)
|
|
||||||
.with_at(places::Timestamp(now.0 - day_ms * (1 + i)));
|
|
||||||
places::storage::history::apply_observation_direct(&tx, obs)?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tx.commit()?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bench_search_frecent(c: &mut Criterion) {
|
|
||||||
let dbdir = Rc::new(TempDir::new("placesbench").unwrap());
|
|
||||||
let dbfile = dbdir.path().join("places.sqlite");
|
|
||||||
let mut db = PlacesDb::open(&dbfile, None).unwrap();
|
|
||||||
init_db(&mut db).unwrap();
|
|
||||||
let db = Rc::new(db);
|
|
||||||
{
|
|
||||||
let db = db.clone();
|
|
||||||
let dir = dbdir.clone();
|
|
||||||
c.bench_function("search_frecent string", move |b| {
|
|
||||||
let _dir = dir.clone(); // ensure it stays alive...
|
|
||||||
let params = SearchParams {
|
|
||||||
search_string: "mozilla".into(),
|
|
||||||
limit: 10,
|
|
||||||
};
|
|
||||||
b.iter(|| search_frecent(&db, params.clone()).unwrap())
|
|
||||||
});
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let db = db.clone();
|
|
||||||
let dir = dbdir.clone();
|
|
||||||
c.bench_function("search_frecent origin", move |b| {
|
|
||||||
let _dir = dir.clone(); // ensure it stays alive...
|
|
||||||
let params = SearchParams {
|
|
||||||
search_string: "blog.mozilla.org".into(),
|
|
||||||
limit: 10,
|
|
||||||
};
|
|
||||||
b.iter(|| search_frecent(&db, params.clone()).unwrap())
|
|
||||||
});
|
|
||||||
}
|
|
||||||
{
|
|
||||||
let db = db.clone();
|
|
||||||
let dir = dbdir.clone();
|
|
||||||
c.bench_function("search_frecent url", move |b| {
|
|
||||||
let _dir = dir.clone(); // ensure it stays alive...
|
|
||||||
let params = SearchParams {
|
|
||||||
search_string: "https://hg.mozilla.org/mozilla-central".into(),
|
|
||||||
limit: 10,
|
|
||||||
};
|
|
||||||
b.iter(|| search_frecent(&db, params.clone()).unwrap())
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
criterion_group!(benches, bench_search_frecent);
|
|
||||||
criterion_main!(benches);
|
|
Загрузка…
Ссылка в новой задаче