wasm VS js,谁快?(七)重构
回顾
开始新内容前让我们先回忆下之前的内容,之前我们构造了一棵约30万个节点的树,测出来结果 wasm比js慢约4倍,比较反直觉,所以我们拆分成:
plain
#[wasm_bindgen]
#[derive(Clone)]
pub struct Item {
name: String,
children: Vec<Item>,
}
#[wasm_bindgen]
pub fn unsafeTreeFun(treeLevel: u32, nodeWidth: u32) -> Item {
let tempNode = Item {
name: String::from(""),
children: vec![],
};
let mut root = tempNode.clone();
root.name = String::from("node_0_0");
if treeLevel < 2 {
return root;
}
let mut nodeStack: VecDeque<&mut Item> = VecDeque::new();
for m1 in 0..nodeWidth {
let mut curItem = tempNode.clone();
curItem.name = format!("node_{}_{}", 1, m1);
root.children.push(curItem);
}
let ptr1 = root.children.as_mut_ptr();
unsafe {
for m2 in 0..nodeWidth {
nodeStack.push_back(&mut *ptr1.add(m2.try_into().unwrap()));
}
}
for i in 2..treeLevel {
let curTotal: u32 = nodeWidth.pow(i - 1);
for j in 0..curTotal {
let shiftItem = nodeStack.pop_front().unwrap();
for k1 in 0..nodeWidth {
let mut curItem = tempNode.clone();
curItem.name = format!("node_{}_{}", i, nodeWidth * j + k1);
shiftItem.children.push(curItem);
}
let ptr2 = shiftItem.children.as_mut_ptr();
unsafe {
for k2 in 0..nodeWidth {
nodeStack.push_back(&mut *ptr2.add(k2.try_into().unwrap()));
}
}
}
}
root
}
plain
total nodes: 299593
wasm-deq-tree: 347.54443359375 ms
js-tree: 7232.81201171875 ms