Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么WebAssembly比JavaScript慢?_Javascript_Performance_Web_Webassembly - Fatal编程技术网

为什么WebAssembly比JavaScript慢?

为什么WebAssembly比JavaScript慢?,javascript,performance,web,webassembly,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

今天我决定第一次玩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;
}
然后,将生成的
.html
文件加载到浏览器中后,我得到的输出是
14930351 592.8
,这意味着WA几乎花费了
600毫秒

然后,我编写了相同程序的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;
}
导出函数fib(n){
返回n==0?0:(n==1?1:fib(n-1)+fib(n-2));
}
导出函数fibSum(n){
设和=0;
for(设i=0;i
我使用
performance.now()
测量运行时间(以毫秒为单位),计算
fibSum(35)
,在Chrome上的输出为
347.200毫秒

我知道WA是非常新的,因此与V8引擎相比,编译器必须缺少一些优化,从浏览器和所有东西调用WA代码需要时间,但我没想到它会这么慢


想法?我没有创建一个适当的测试用例来比较这两个吗?

您能从代码中删除所有
std::chrono
内容和
std::cout
,然后再试一次吗?我使用您提供的js代码创建了一个.js文件并对其进行了测试,当我使用(
node fibjs.js
)对其进行测试时,大约需要150毫秒。然后,我编译了两次C代码:一次使用chrono,一次不使用。对于第二个版本,我在
run
函数前后将时间测量代码放入生成的js文件中。第一个编译版本需要300毫秒以上,但第二个需要130-150毫秒,非常接近纯js代码。因此…根据我的结果,我猜使用大量库或复杂函数也会影响编译后的js代码。@Adi你能告诉我在生成的
fib.js
文件中把时间测量代码放在哪里吗?我尝试删除所有
chrono
内容,并将时间测量代码放入生成的JS文件的
run(args)
方法中,但没有区别;我分析了代码,基本上这就是程序的入口点。您可以使用一个简单的
console.time('test');run();控制台。时间结束(“测试”)来测量时间。您也没有使用优化(
emcc-O3
-Os
)进行构建。
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;
}