Skip to content

Commit 54d43ea

Browse files
Merge pull request #151 from JakeRoggenbuck/speed-up-merge
Speed up merge
2 parents 27739f8 + 374152a commit 54d43ea

File tree

4 files changed

+352
-5
lines changed

4 files changed

+352
-5
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ harness = false
2828
name = "query_benchmarks"
2929
harness = false
3030

31+
[[bench]]
32+
name = "merge_benchmarks"
33+
harness = false
34+
3135
[profile.bench]
3236
debug = true
3337

benches/merge_benchmarks.rs

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
2+
use redoxql::pagerange::PageRange;
3+
use redoxql::record::{Record, RecordAddress};
4+
use redoxql::table::PageDirectory;
5+
use std::sync::{Arc, Mutex};
6+
use std::time::Duration;
7+
8+
fn setup_benchmark_data(
9+
num_records: usize,
10+
num_cols: i64,
11+
) -> (PageRange, Arc<Mutex<PageDirectory>>) {
12+
let page_range = PageRange::new(num_cols);
13+
let page_directory = Arc::new(Mutex::new(PageDirectory::new()));
14+
15+
{
16+
let mut pd = page_directory.lock().unwrap();
17+
18+
// We usually have less columns (30 seems realistic)
19+
for i in 0..30 {
20+
let rid = i as i64;
21+
let mut addresses = Vec::new();
22+
23+
addresses.push(RecordAddress {
24+
page: page_range.base_container.rid_page(),
25+
offset: i as i64,
26+
});
27+
28+
let record = Record {
29+
rid,
30+
addresses: Arc::new(Mutex::new(addresses)),
31+
};
32+
33+
pd.directory.insert(rid, record);
34+
}
35+
36+
for i in 0..num_records {
37+
let rid = (1000 + i) as i64;
38+
let mut addresses = Vec::new();
39+
40+
addresses.push(RecordAddress {
41+
page: page_range.base_container.rid_page(),
42+
offset: (i % 100) as i64,
43+
});
44+
45+
let record = Record {
46+
rid,
47+
addresses: Arc::new(Mutex::new(addresses)),
48+
};
49+
50+
pd.directory.insert(rid, record);
51+
}
52+
}
53+
54+
{
55+
let a = page_range.tail_container.rid_page();
56+
let mut rid_guard = a.lock().unwrap();
57+
rid_guard.data.resize(num_records, 0);
58+
for i in 0..num_records {
59+
rid_guard.data[i] = (1000 + i) as i64;
60+
}
61+
}
62+
63+
(page_range, page_directory)
64+
}
65+
66+
fn benchmark_merge(c: &mut Criterion) {
67+
let mut group = c.benchmark_group("PageRange_Merge");
68+
69+
for size in [100, 1_000, 10_000, 100_000].iter() {
70+
group.bench_with_input(BenchmarkId::new("Original", size), size, |b, &size| {
71+
b.iter_with_setup(
72+
|| setup_benchmark_data(size as usize, 5),
73+
|(mut page_range, pd)| {
74+
black_box(page_range.merge(pd));
75+
},
76+
);
77+
});
78+
79+
group.bench_with_input(BenchmarkId::new("Optimized", size), size, |b, &size| {
80+
b.iter_with_setup(
81+
|| setup_benchmark_data(size as usize, 5),
82+
|(mut page_range, pd)| {
83+
black_box(page_range.optimized_merge(pd));
84+
},
85+
);
86+
});
87+
}
88+
89+
group.finish();
90+
}
91+
92+
fn benchmark_column_counts(c: &mut Criterion) {
93+
let mut group = c.benchmark_group("PageRange_ColumnCounts");
94+
95+
for cols in [3, 5].iter() {
96+
group.bench_with_input(BenchmarkId::new("Original", cols), cols, |b, &cols| {
97+
b.iter_with_setup(
98+
|| setup_benchmark_data(100, cols),
99+
|(mut page_range, pd)| {
100+
black_box(page_range.merge(pd));
101+
},
102+
);
103+
});
104+
105+
group.bench_with_input(BenchmarkId::new("Optimized", cols), cols, |b, &cols| {
106+
b.iter_with_setup(
107+
|| setup_benchmark_data(100, cols),
108+
|(mut page_range, pd)| {
109+
black_box(page_range.optimized_merge(pd));
110+
},
111+
);
112+
});
113+
}
114+
115+
group.finish();
116+
}
117+
118+
criterion_group! {
119+
name = benches;
120+
config = Criterion::default()
121+
.measurement_time(Duration::from_secs(10))
122+
.sample_size(10);
123+
targets = benchmark_merge, benchmark_column_counts
124+
}
125+
criterion_main!(benches);

python/benchmarks/scaling_tester.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ def run_inserts(amount: int):
1616

1717
def run_updates(amount: int):
1818
db = Database()
19+
# TODO: Make sure this doesn't save data between runs.
20+
# I don't think it does, but I need to check
1921
grades_table = db.create_table("Grades", 5, 0)
2022
query = Query(grades_table)
2123

0 commit comments

Comments
 (0)