目前,我正在尝试使用Rust开发web应用程序的一部分,将其编译为wasm部分(有类似的框架,如yew,等等),但我发现使用组件可能会有更多的消耗,例如,我必须执行单击按钮调用JS函数。JS函数执行一些计算(非常简单的计算),并将结果呈现给dom。
只使用js的解决方案:
使用Rust +组件的解决方案:
在这里,我们不考虑使用React或Vue,仅仅使用WebAssembly可能会降低性能,这主要体现在:
We子组件的优点可能是计算速度更快,但由于上述开销的增加,这种优势可能不会节省整个时间,而且在DOM操作方面显然比较慢。
但我仍然对DOM操作进行了比较测试:
JS创建了10,000个p标记,并花费了大约120 JS:
function web_bench() {
let container = document.getElementById("container");
let begin = Date.now();
for(let i = 0; i < 10000; i += 1) {
let str = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" +
"123456789012345678901234567890123456abcd123456789012345678901234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789012345678哈哈1234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789哈哈2345678901234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" +
"123456789012345678901234567890123456789012345678901234567890123嘻嘻67890123456789012345678901234567890" +
"12345678901234567890123456789012345678901234哈哈哈012345678901234567890123456789012345678901234567890";
let p = document.createElement("p");
p.innerHTML = str;
container.appendChild(p);
}
let time = Date.now() - begin;
console.log('cost time:', time);
}如果我使用铁锈:费用180毫秒
#[wasm_bindgen]
pub fn bench() {
let document = web_sys::window().unwrap().document().unwrap();
for i in 0..10000 {
let str = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456abcd1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678哈哈123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789哈哈234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678902345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123嘻嘻6789012345678901234567890123456789012345678901234567890123456789012345678901234哈哈哈012345678901234567890123456789012345678901234567890";
let p = document
.create_element("p")
.unwrap();
p.set_inner_html(str);
document
.get_element_by_id("container")
.unwrap()
.append_child(&p);
}
}这是否意味着rust+wasm不适合与dom操作频繁交互的web开发,而只适用于计算模块。当前的锈蚀网络框架是如何看待这个问题的?我的分析正确吗?
谢谢你的意见~
发布于 2019-11-24 08:04:46
有一些东西会增加JS <=> WebAssembly调用的开销,并影响性能:
这两种方法都会在每个函数调用的基础上产生可测量的开销。
然而,情况正在改善..。
WebAssembly是一种非常新的技术,优化和解决性能问题需要时间。
这是否意味着rust+wasm不适合与dom操作频繁交互的web开发?
目前,有可能是的。在未来,这可能是可行的。
我的分析正确吗?
你目前的观察,它现在有点慢是正确的。
https://stackoverflow.com/questions/59015066
复制相似问题