File tree Expand file tree Collapse file tree 2 files changed +32
-8
lines changed Expand file tree Collapse file tree 2 files changed +32
-8
lines changed Original file line number Diff line number Diff line change @@ -3,6 +3,8 @@ use datafrog::Iteration;
3
3
4
4
fn main ( ) {
5
5
6
+ let timer = :: std:: time:: Instant :: now ( ) ;
7
+
6
8
// Make space for input data.
7
9
let mut nodes = Vec :: new ( ) ;
8
10
let mut edges = Vec :: new ( ) ;
@@ -28,6 +30,8 @@ fn main() {
28
30
}
29
31
}
30
32
33
+ println ! ( "{:?}\t Data loaded" , timer. elapsed( ) ) ;
34
+
31
35
// Create a new iteration context, ...
32
36
let mut iteration = Iteration :: new ( ) ;
33
37
@@ -47,4 +51,6 @@ fn main() {
47
51
48
52
// let _reachable = variable1.complete();
49
53
54
+ println ! ( "{:?}\t Computation complete" , timer. elapsed( ) ) ;
55
+
50
56
}
Original file line number Diff line number Diff line change @@ -33,15 +33,33 @@ pub struct Relation<Tuple: Ord> {
33
33
34
34
impl < Tuple : Ord > Relation < Tuple > {
35
35
/// 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
44
51
}
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 }
45
63
}
46
64
}
47
65
You can’t perform that action at this time.
0 commit comments