Skip to content

Commit 6d8ad17

Browse files
committed
benchmarks
1 parent b5aa134 commit 6d8ad17

File tree

2 files changed

+144
-0
lines changed

2 files changed

+144
-0
lines changed

datafusion/expr/src/tree_node/expr.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,3 +477,75 @@ where
477477
}
478478
Ok(v)
479479
}
480+
481+
#[cfg(test)]
482+
mod test {
483+
use crate::{and, lit, Expr};
484+
use datafusion_common::tree_node::{Transformed, TreeNode, TreeNodeRecursion};
485+
use std::time::Instant;
486+
487+
fn create_and_tree(level: u32) -> Expr {
488+
if level == 0 {
489+
lit(true)
490+
} else {
491+
and(create_and_tree(level - 1), create_and_tree(level - 1))
492+
}
493+
}
494+
495+
#[test]
496+
fn transform_test() {
497+
let now = Instant::now();
498+
let mut and_tree = create_and_tree(25);
499+
println!("create_and_tree: {}", now.elapsed().as_millis());
500+
501+
let now = Instant::now();
502+
and_tree = and_tree
503+
.transform_down_old(&mut |e| Ok(Transformed::No(e)))
504+
.unwrap();
505+
println!("and_tree.transform_down_old: {}", now.elapsed().as_millis());
506+
507+
let now = Instant::now();
508+
let mut and_tree_clone = and_tree.clone();
509+
println!("and_tree.clone: {}", now.elapsed().as_millis());
510+
511+
let now = Instant::now();
512+
and_tree_clone
513+
.transform_down(&mut |_e| Ok(TreeNodeRecursion::Continue))
514+
.unwrap();
515+
println!(
516+
"and_tree_clone.transform_down: {}",
517+
now.elapsed().as_millis()
518+
);
519+
520+
println!("results: {}", and_tree == and_tree_clone);
521+
522+
let now = Instant::now();
523+
and_tree = and_tree
524+
.transform_down_old(&mut |e| match e {
525+
Expr::Literal(_) => Ok(Transformed::Yes(lit(false))),
526+
o => Ok(Transformed::No(o)),
527+
})
528+
.unwrap();
529+
println!(
530+
"and_tree.transform_down_old 2: {}",
531+
now.elapsed().as_millis()
532+
);
533+
534+
let now = Instant::now();
535+
and_tree_clone
536+
.transform_down(&mut |e| match e {
537+
Expr::Literal(_) => {
538+
*e = lit(false);
539+
Ok(TreeNodeRecursion::Continue)
540+
}
541+
_ => Ok(TreeNodeRecursion::Continue),
542+
})
543+
.unwrap();
544+
println!(
545+
"and_tree_clone.transform_down 2: {}",
546+
now.elapsed().as_millis()
547+
);
548+
549+
println!("results: {}", and_tree == and_tree_clone);
550+
}
551+
}

datafusion/expr/src/tree_node/plan.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,75 @@ impl TreeNode for LogicalPlan {
7979
Ok(tnr)
8080
}
8181
}
82+
83+
#[cfg(test)]
84+
mod test {
85+
use crate::{LogicalPlanBuilder, LogicalPlan};
86+
use datafusion_common::tree_node::{Transformed, TreeNode, TreeNodeRecursion};
87+
use std::time::Instant;
88+
89+
fn create_union_tree(level: u32) -> LogicalPlanBuilder {
90+
if level == 0 {
91+
LogicalPlanBuilder::empty(true)
92+
} else {
93+
create_union_tree(level - 1).union(create_union_tree(level - 1).build().unwrap()).unwrap()
94+
}
95+
}
96+
97+
#[test]
98+
fn transform_test() {
99+
let now = Instant::now();
100+
let mut union_tree = create_union_tree(25).build().unwrap();
101+
println!("create_union_tree: {}", now.elapsed().as_millis());
102+
103+
let now = Instant::now();
104+
union_tree = union_tree
105+
.transform_down_old(&mut |p| Ok(Transformed::No(p)))
106+
.unwrap();
107+
println!("union_tree.transform_down_old: {}", now.elapsed().as_millis());
108+
109+
let now = Instant::now();
110+
let mut union_tree_clone = union_tree.clone();
111+
println!("union_tree.clone: {}", now.elapsed().as_millis());
112+
113+
let now = Instant::now();
114+
union_tree_clone
115+
.transform_down(&mut |_p| Ok(TreeNodeRecursion::Continue))
116+
.unwrap();
117+
println!(
118+
"union_tree_clone.transform_down: {}",
119+
now.elapsed().as_millis()
120+
);
121+
122+
println!("results: {}", union_tree == union_tree_clone);
123+
124+
let now = Instant::now();
125+
union_tree = union_tree
126+
.transform_down_old(&mut |p| match p {
127+
LogicalPlan::EmptyRelation(_) => Ok(Transformed::Yes(LogicalPlanBuilder::empty(false).build().unwrap())),
128+
o => Ok(Transformed::No(o)),
129+
})
130+
.unwrap();
131+
println!(
132+
"union_tree.transform_down_old 2: {}",
133+
now.elapsed().as_millis()
134+
);
135+
136+
let now = Instant::now();
137+
union_tree_clone
138+
.transform_down(&mut |p| match p {
139+
LogicalPlan::EmptyRelation(_) => {
140+
*p = LogicalPlanBuilder::empty(false).build().unwrap();
141+
Ok(TreeNodeRecursion::Continue)
142+
}
143+
_ => Ok(TreeNodeRecursion::Continue),
144+
})
145+
.unwrap();
146+
println!(
147+
"union_tree_clone.transform_down 2: {}",
148+
now.elapsed().as_millis()
149+
);
150+
151+
println!("results: {}", union_tree == union_tree_clone);
152+
}
153+
}

0 commit comments

Comments
 (0)