Skip to content
风起
风起

wasm VS js,谁快?(六)向量

回顾

开始新内容前让我们先回忆下之前的内容,之前我们构造了一棵约30万个节点的树,测出来结果 wasm比js慢约4倍,比较反直觉,所以我们拆分成:

bash
#[wasm_bindgen]
#[derive(Clone)]
pub struct Item {
    name: String,
    children: Vec<Item>,
}

#[wasm_bindgen]
pub fn vecFun(len: usize) {
    let mut nodeStack = vec![];
    for _ in 0..len {
        let tempNode = Item {
            name: String::from(""),
            children: vec![],
        };
        nodeStack.push(tempNode);
    }

    for _ in 0..len {
        nodeStack.remove(0);
    }
}
bash
const vecFun = (len) => {
    const nodeStack = [];
    for (let i=0; i<len; i++) {
        const item = {
            name: '',
            children: [],
        };
        nodeStack.push(item);
    }

    for (let i=0; i<len; i++) {
        nodeStack.shift();
    }
}

plain
wasm-vec: 481.01708984375 ms
js-vec: 6.257080078125 ms
[参考向量大小与容量](https://www.educative.io/answers/memory-management-of-vectors-in-rust)

plain
#[wasm_bindgen]
pub fn vecDeqFun(len: usize) {
    let mut nodeStack: VecDeque<Item> = VecDeque::new();
    for _ in 0..len {
        let item = Item {
            name: String::from(""),
            children: vec![],
        };
        nodeStack.push_back(item);
    }

    for _ in 0..len {
        nodeStack.pop_front();
    }
}

优化后结论

plain
wasm-vec: 508.14501953125 ms
wasm-vec-deq: 0.658935546875 ms
js-vec: 7.974853515625 ms

可以看到使用了双端队列后变快了,wasm比js快约12倍。

问题找到了,那让我们重构下最开始反直觉的那段代码,看看效果如何。

欲知后事如何且听下回分解。