与JavaScript相比,为什么WebAssembly这么慢?

Raj*_*ena 5 javascript performance web webassembly

今天我决定第一次使用WebAssembly.所以,我用C++编写了这个小的Fibonacci程序:

#include <iostream>
#include <chrono>

int fib(int n) {
    if(n==0) {
        return 0;
    } else if(n==1) {
        return 1;
    } else {
        return fib(n-1) + fib(n-2);
    }
}

int main() {
    std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
    int sum = 0;

    for (int i = 0; i < 35; ++i) {
        sum += fib(i);
    }

    std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> dur = t2 - t1;

    std::cout << sum << std::endl;
    std::cout << dur.count() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Web Assembly使用以下命令将其编译为(WA从现在开始):

emcc fib.cpp -s WASM=1 -o fib.html
Run Code Online (Sandbox Code Playgroud)

然后,在将生成的.html文件加载到浏览器中之后,我得到的输出就是14930351 592.8,这意味着WA几乎耗尽了600 milliseconds.

然后,我写了一个相同程序的JS等价物,如下:

export function fib(n) {
    return n === 0 ? 0 : (n === 1 ? 1 : fib(n-1) + fib(n-2));
}

export function fibSum(n) {
    let sum = 0;
    for (let i = 0; i < n; i++) {
        sum += fib(i)
    }

    return sum;
}
Run Code Online (Sandbox Code Playgroud)

我曾经performance.now()测量过计算的经过时间(以毫秒为单位)fibSum(35),这给出了347.200 millisecondsChrome 的输出.

我知道WA是非常新的,因此与V8引擎相比,编译器必须缺少一些优化,并且从浏览器调用WA代码需要花费时间,但我不希望它变得如此缓慢.

思考?我没有创建一个合适的测试用例来比较两者吗?