Skip to content

Commit

Permalink
test: add wasm bench in rust
Browse files Browse the repository at this point in the history
  • Loading branch information
zxch3n committed Jun 11, 2022
1 parent b36d70c commit 0cde6ef
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 16 deletions.
69 changes: 67 additions & 2 deletions rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions rust/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,7 @@ test:

clean:
cargo clean

bench-wasm:
cd crates/wasm && \
wasm-pack test --firefox --headless --release
25 changes: 20 additions & 5 deletions rust/crates/tidy-tree/tests/layout_bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

mod aesthetic_rules;
mod gen;

use rand::{prelude::StdRng, SeedableRng};
use tidy_tree::{BasicLayout, Layout, TidyLayout};
extern crate test;
use test::Bencher;
use test::{black_box, Bencher};

#[bench]
fn bench_tidy_layout(bench: &mut Bencher) {
Expand All @@ -16,9 +17,23 @@ fn bench_tidy_layout(bench: &mut Bencher) {
peer_margin: 10.,
};

bench.iter(|| {
bench.iter(black_box(|| {
layout.layout(&mut tree);
}));
}

#[bench]
fn bench_tidy_layout_large(bench: &mut Bencher) {
let mut rng = StdRng::seed_from_u64(1001);
let mut tree = gen::gen_tree(&mut rng, 1_000_000);
let layout = TidyLayout {
parent_child_margin: 10.,
peer_margin: 10.,
};

bench.iter(black_box(|| {
layout.layout(&mut tree);
});
}));
}

#[bench]
Expand All @@ -30,7 +45,7 @@ fn bench_naive_layout(bench: &mut Bencher) {
peer_margin: 10.,
};

bench.iter(|| {
bench.iter(black_box(|| {
layout.layout(&mut tree);
});
}));
}
8 changes: 0 additions & 8 deletions rust/crates/wasm/.cargo/config

This file was deleted.

12 changes: 11 additions & 1 deletion rust/crates/wasm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,21 @@ edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
crate-type = ["cdylib"]
crate-type = ["cdylib", "rlib"]

[dependencies]
wasm-bindgen = "0.2.74"
tidy-tree = { path = "../tidy-tree" }

[dev-dependencies]
getrandom = { version = "0.2", features = ["js"] }
rand = "0.8.5"
wasm-bindgen-test = "0.3.30"

[dependencies.web-sys]
version = "0.3.4"
features = [
'Window',
'Performance',
'PerformanceTiming'
]
44 changes: 44 additions & 0 deletions rust/crates/wasm/tests/bench.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use rand::{prelude::StdRng, SeedableRng};
use wasm::Tidy;
use web_sys::{self, Performance};

mod gen;
use gen::gen_tree;
extern crate wasm_bindgen_test;
use wasm_bindgen_test::*;

wasm_bindgen_test_configure!(run_in_browser);

#[wasm_bindgen_test]
fn bench_tidy() {
let performance = get_performance();
let mut rng = StdRng::seed_from_u64(1001);
let tree = gen_tree(&mut rng, 100_000);
let mut layout = Tidy::with_tidy_layout();
tree.pre_order_traversal(|node| {
if node.parent.is_some() {
layout.add_node(
node.id,
node.width,
node.height,
unsafe { node.parent.unwrap().as_ref() }.id,
);
} else {
layout.add_node(node.id, node.width, node.height, Tidy::null_id());
}
});
let start = performance.now();
let times = 8;
for _ in 0..times {
layout.layout();
}
console_log!("{}ms", (performance.now() - start) / (times as f64));
}

fn get_performance() -> Performance {
let window = web_sys::window().expect("should have a window in this context");
let performance = window
.performance()
.expect("performance should be available");
performance
}
39 changes: 39 additions & 0 deletions rust/crates/wasm/tests/gen.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use std::ptr::NonNull;

use rand::prelude::*;
use tidy_tree::{geometry::Coord, Node};

pub fn gen_node(rng: &mut StdRng) -> Node {
Node {
id: rng.gen(),
width: rng.gen_range(5..50) as Coord,
height: rng.gen_range(5..50) as Coord,
x: 0.,
y: 0.,
relative_x: 0.,
relative_y: 0.,
bbox: Default::default(),
parent: None,
children: vec![],
tidy: None,
}
}

pub fn gen_tree(rng: &mut StdRng, num: usize) -> Node {
let root = gen_node(rng);
let mut nodes: Vec<NonNull<Node>> = vec![(&root).into()];
let max_chosen_size = 100;
for _ in 0..num {
let parent_index = if nodes.len() < max_chosen_size {
rng.gen_range(0..nodes.len())
} else {
rng.gen_range((nodes.len() - max_chosen_size)..nodes.len())
};
let parent = unsafe { nodes[parent_index].as_mut() };
let node = gen_node(rng);
parent.append_child(node);
nodes.push(parent.children.last().unwrap().as_ref().into());
}

root
}

0 comments on commit 0cde6ef

Please sign in to comment.