Почему WebAssembly такой медленный по сравнению с JavaScript? - PullRequest
0 голосов
/ 18 ноября 2018

Сегодня я решил поиграть с 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 из браузера и всего остального, но я не ожидал, что он будет таким медленным.

Мысли? Разве я не создал надлежащий контрольный пример для сравнения двух?

...