Сегодня я решил поиграть с 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)
, что дало вывод 347.200 milliseconds
в Chrome.
Я понял, что WA очень новый, поэтому в компиляторе не хватает некоторых оптимизаций по сравнению с движком V8, и требуется время для вызова кода WA из браузера и всего остального, но я не ожидал, что он будет таким медленным.
Мысли? Разве я не создал надлежащий контрольный пример для сравнения двух?