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

时间:2018-11-18 12:30:03

标签: javascript performance web webassembly

今天,我决定第一次玩WebAssembly。所以,我用C ++编写了这个小的斐波那契程序:

#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;
}

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

emcc fib.cpp -s WASM=1 -o fib.html

然后,将生成的.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;
}

我用performance.now()来衡量经过时间,以毫秒为单位来计算fibSum(35),在Chrome上的输出为347.200 milliseconds

我知道WA是一个非常新的东西,因此与V8引擎相比,编译器必须缺少一些优化,并且从浏览器和所有内容中调用WA代码花费时间,但是我并不希望它这么慢。 / p>

有什么想法吗?我是否没有创建适当的测试用例来比较两者?

0 个答案:

没有答案