为什么WebAssembly比JavaScript慢?
今天我决定第一次玩WebAssembly。所以,我用C++编写了这个小斐波那契程序:为什么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
#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;
}