首页 > 解决方案 > Web 组装速度与 js 等效

问题描述

我正在尝试快速渲染 Mandelbrot 集,所以我重新制作了 Web 汇编中的计算函数,认为它会更快但速度相同

(module
  (func (export "getcolorj") (param f64 f64 f64 f64) (result i32) (local f64 f64 i32 f64 f64) 
    local.get 0
    local.set 4;;cx=x
    local.get 1
    local.set 5;;ci=i
    i32.const 0
    local.set 6;;i3=0
    (block
    (loop
    local.get 4
    local.get 4
    f64.mul
    local.get 5
    local.get 5
    f64.mul
    f64.sub
    local.set 7;;const temp=cx**2-ci**2
      
    local.get 4
    local.get 5
    f64.mul
    f64.const 2
    f64.mul
    local.get 3
    f64.add
    local.set 5;;ci=cx*ci*2+i
      
    local.get 7
    local.get 2
    f64.add
    local.set 4;;cx=temp+x
      
    local.get 4
    local.get 4
    f64.mul
    local.get 5
    local.get 5
    f64.mul
    f64.add
    local.set 7;;(cx**2+ci**2)
     
    local.get 6
    i32.const 1
    i32.add
    local.set 6;;i3++
    (i32.eq (local.get 6) (i32.const 100))
    (f64.gt (local.get 7) (f64.const 4))
    i32.add
    (i32.ne (i32.const 0))
    br_if 1
    (br 0)
    )
     )
    local.get 6
    i32.const -1
    i32.add
)
)

对比

function getcolorj(x,i,juliusx,juliusi,deap){
var cx= x
var ci= i
var i3=0
for("";i3<deap;i3++){
const temp=cx**2-ci**2
ci=cx*ci*2+juliusi
cx=temp+juliusx
if((cx**2+ci**2)>4){break;}
}
return i3
}

我不知道我做错了什么,或者如果事情就是这样,我只是让 Web 程序集很糟糕吗?这是我第一次尝试所以如果是这样我不会太惊讶

JIC 我是如何开始的很重要:

WebAssembly.instantiateStreaming(fetch('test.wasm'), {})
.then(results => {
  console.log()
  getcolorj=results.instance.exports.getcolorj
});

顺便说一句,为了质量,我正在做 10,000 次交互,是的,在渲染黑色部分时,两者都会减慢速度。

标签: javascriptwebassembly

解决方案


在大多数实际应用程序中,WebAssembly 不会给你带来比 JavaScript 显着的速度提升,原因很简单,JavaScript 已经非常快了。

它将为您提供更可预测的运行时性能,并在将来访问诸如 SIMD 之类的功能,这些功能在某些情况下可能会提供更好的性能。

有关更多详细信息,请参阅此问题:

为什么 webAssembly 函数比相同的 JS 函数慢近 300 倍


推荐阅读