Как измерить производительность с помощью асин c функций в javascript - PullRequest
0 голосов
/ 17 февраля 2020

Я создал небольшое приложение, которое сравнивает скорости WebAssembly и Javascript. К моему удивлению, JavaScript намного быстрее при расчете факториалов большого числа. Или, по крайней мере, кажется, что это так. Я уверен, что это неправильно и вызвано синтаксисом ожидания, который я использую. (Функции одинаковы.) Кроме того, какие действительно трудоемкие задачи я могу использовать для сравнения этих двух? На самом деле это не кажется трудоемким, так как это занимает менее 0,1 миллисекунды.

AssemblyScript (это компилируется в wasm)

// The entry file of your WebAssembly module.
export function fib(num: i32): i32 {
  var a: i32 = 1,
    b: i32 = 0,
    temp: i32;

  while (num > 0) {
    temp = a;
    a = a + b;
    b = temp;
    num--;
  }

  return b;
}

Приложение. js

import waApi from "./api";
...
  <button
       onClick={async () => {
       const t0 = performance.now();
       (await waApi).fib(200);
       const t1 = performance.now();
       this.updateGraph(t1 - t0, "wa");
       const t2 = performance.now();
       this.fib(200);
       const t3 = performance.now();
       this.updateGraph(t3 - t2, "js");
       }}>
Calculate with both 
  </button>

api. js

import { instantiateStreaming } from "assemblyscript/lib/loader";

export default instantiateStreaming(fetch("./assembly.wasm"));

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Это должно быть

import waApi from "./api";

class Test extends React.Component { 
  async componentDidMount() {
    this.wasmModule = await waApi;
  }

  render() {
    return (
      <button
        onClick={() => {
          const module = this.wasmModule;
          if (!module) {
            console.warn("module not yet loaded. Try later");
            return;
          }
          const t0 = performance.now();
          module.fib(200);
          const t1 = performance.now();
          this.updateGraph(t1 - t0, "wa");
          const t2 = performance.now();
          this.fib(200);
          const t3 = performance.now();
          this.updateGraph(t3 - t2, "js");
        }}>
    );
  }
}

Потому что в вашем примере для wasm части вы также измерили загрузку и создание экземпляра модуля.

0 голосов
/ 18 февраля 2020

Проблема с микро-эталонами (т. Е. Эталонами, которые анализируют производительность небольшой, очень быстрой функции) заключается в том, что вы почти всегда заканчиваете тем, что измеряете не то, что нужно. Ваши измерения будут сильно искажены из-за:

  • Издержки, связанные с вызовом функций WebAssembly из JavaScript
  • Способность компилятора AssemblyScript (который является очень новым) оптимизировать ваша функция
  • Точность вашего таймера
  • Время, в течение которого ваш JavaScript двигатель достигнет максимальной оптимизации

Просто назвать несколько!

Более реалистичный бенчмарк c будет выполнять вычисления, которые выполняют гораздо больший диапазон операций WebAssembly, будет носить более реалистичный характер (т. Е. Измерять типы нагрузки, которые вы действительно выгрузили бы в WebAssembly), и занимать больше времени. выполнить.

Вот гораздо лучший тест, основанный на эмуляторе GameBoy:

https://medium.com/@torch2424 / webassembly-is-fast-a-real-world-benchmark-of-webassembly -vs-ES6-d85a23f8e193

...