diff --git a/components/places/Cargo.toml b/components/places/Cargo.toml index 2fe086f2a..328f2dd6b 100644 --- a/components/places/Cargo.toml +++ b/components/places/Cargo.toml @@ -55,5 +55,5 @@ name = "match_impl" harness = false [[bench]] -name = "search_frecent" +name = "search" harness = false \ No newline at end of file diff --git a/components/places/benches/search.rs b/components/places/benches/search.rs new file mode 100644 index 000000000..c95c66d11 --- /dev/null +++ b/components/places/benches/search.rs @@ -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 = 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 { + 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); diff --git a/components/places/benches/search_frecent.rs b/components/places/benches/search_frecent.rs deleted file mode 100644 index 79a057c5e..000000000 --- a/components/places/benches/search_frecent.rs +++ /dev/null @@ -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 = 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);