Skip to content

Commit c577a6c

Browse files
committed
re-use allocations
1 parent ba9b4d3 commit c577a6c

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

src/bin/graspan1.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use datafrog::Iteration;
33

44
fn main() {
55

6+
let timer = ::std::time::Instant::now();
7+
68
// Make space for input data.
79
let mut nodes = Vec::new();
810
let mut edges = Vec::new();
@@ -28,6 +30,8 @@ fn main() {
2830
}
2931
}
3032

33+
println!("{:?}\tData loaded", timer.elapsed());
34+
3135
// Create a new iteration context, ...
3236
let mut iteration = Iteration::new();
3337

@@ -47,4 +51,6 @@ fn main() {
4751

4852
// let _reachable = variable1.complete();
4953

54+
println!("{:?}\tComputation complete", timer.elapsed());
55+
5056
}

src/lib.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,33 @@ pub struct Relation<Tuple: Ord> {
3333

3434
impl<Tuple: Ord> Relation<Tuple> {
3535
/// Merges two relations into their union.
36-
pub fn merge(mut self, mut other: Self) -> Self {
37-
let mut vec = Vec::with_capacity(self.len() + other.len());
38-
vec.extend(self.elements.drain(..));
39-
vec.extend(other.elements.drain(..));
40-
vec.sort();
41-
vec.dedup();
42-
Relation {
43-
elements: vec
36+
pub fn merge(self, other: Self) -> Self {
37+
38+
let mut elements1 = self.elements;
39+
let mut elements2 = other.elements;
40+
41+
// Ensure elements1.cap() >= elements2.cap().
42+
if elements1.capacity() < elements2.capacity() {
43+
::std::mem::swap(&mut elements1, &mut elements2);
44+
}
45+
46+
// Merge results either in spare capacity or new vector.
47+
let mut elements =
48+
if elements1.len() + elements2.len() < elements1.capacity() {
49+
elements1.extend(elements2.into_iter());
50+
elements1
4451
}
52+
else {
53+
let mut vec = Vec::with_capacity(elements1.len() + elements2.len());
54+
vec.extend(elements1.into_iter());
55+
vec.extend(elements2.into_iter());
56+
vec
57+
};
58+
59+
// Sort, dedup, and return.
60+
elements.sort();
61+
elements.dedup();
62+
Relation { elements }
4563
}
4664
}
4765

0 commit comments

Comments
 (0)