今天,我决定第一次玩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>
有什么想法吗?我是否没有创建适当的测试用例来比较两者?