基本信息
背景与目标
1.背景
原来我理解的wasm 是js 通过wasm可以调用到原生api,所以想绕过js调用浏览器的api触发原生事件时的浏览器的主动提醒,例如:js通过webRtc录屏时,浏览器会弹出提示框获得用户许可,我想绕过这个弹框的操作,所以基于自己对wasm 错误理解,所以想用wasm调用原生录屏,绕过浏览器; 然而实际上wasm是调用浏览器的api,所以调用原生api绕不过浏览器!!! 在调研过程中,都说wasm多么快,多么快,我们今天就一探究竟,偶遇了520这个日子,虽然在这个日子里老说快也不太好。。。。
2.目标
1.通过时间复杂度来比较 O(n): JS代码:
function f1_on(len){
for(let i=0;i<len;i++){
}
}
rust代码:
#[wasm_bindgen]
pub fn f1_on(n:u32){
for _i in 1..n{
}
}
执行代码:
var get_time = function(){
var times =[];
for(let i = 10; i<10000000000;i=i*10){
let start = Date.now();
f1_on(i)
let js_time = Date.now()-start
let start_rust = Date.now();
wasm.f1_on(i);
let rust_time = Date.now()-start_rust;
times.push({
n:`n值为:${i}`,
js:js_time,
rust:rust_time
})
}
console.log("当时间复杂度为O(n)")
console.table(times);
}
结果显示:在100亿次空循环时,js的耗时不足1s,理论上可以接受哈
O(n2): js代码:
function f1_on2(len){
for(let i=0;i<len;i++){
for(let j=0;j<len;j++){
}
}
}
rust代码:
#[wasm_bindgen]
pub fn f1_on2(n:u32){
for _i in 1..n{
for _j in 1..n{
}
}
}
执行代码:
var get_time1 =function(){
var times =[];
for(let i = 10; i<1000000;i=i*10){
let start = Date.now();
f1_on2(i)
let js_time = Date.now()-start
let start_rust = Date.now();
wasm.f1_on2(i);
let rust_time = Date.now()-start_rust;
times.push({
n:`n值为:${i}`,
js:js_time,
rust:rust_time
})
}
console.log("当时间复杂度为O(n2)")
console.table(times);
}
结果显示:
主要结论
着实有点快,可以开始考虑以后项目中耗时操作采用wasm
demo地址:github仓库地址:master分支