Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebAssembly: Приручи дракона

WebAssembly: Приручи дракона

Производительность, V8, дракончики

Polina Gurtovaya

June 27, 2020
Tweet

More Decks by Polina Gurtovaya

Other Decks in Programming

Transcript

  1. 2

  2. 3

  3. 4

  4. 10 Процессоры не понимают этот код function div() { return

    Math.random() / 2; } const arr = []; for (let i = 0; i < 11088; i++) { arr[i] = div(); }
  5. 12

  6. 20 #include <stdio.h> int main() { int result = 0;

    for (int i = 0; i < 100; ++i) { if (i > 10) { result += i * 2; } else { result += i * 11; } } printf("%d\n", result); return 0; } define hidden i32 @main() local_unnamed_addr #0 { entry: %0 = tail call i32 (i8*, ...) @iprintf(…), i32 10395) ret i32 0 }
  7. 21 Магия компиляторов Function inlining Common subexpression elimination Constant propagations

    Code motion Strength reduction Branch offset optimization Register allocation
  8. 22 IR, идеальное для Web Легко превратить в машинный код

    Не зависит от архитектуры системы Компактное Легко парсить
  9. 23 WebAssembly is a binary instruction format for a stack-based

    virtual machine. WebAssembly is a virtual ISA
  10. 24 (func (export "add") (param i32) (param i32) (result i32)

    local.get 0 local.get 1 i32.add) add(1, 2) Module Memory Function Instruction Table
  11. 25 (module (func $i (import "imports" "logger") (param i32)) (memory

    (import "imports" "importedMemory") 1) (func (export "exportedFunc") i32.const 42 call $i) (func (export "add") (param i32 i32) (result i32) local.get 0 local.get 1 i32.add) (data (i32.const 0) "Fifty"))
  12. 29 Hot functions function div() { return Math.random() / 2;

    } const arr = []; for (let i = 0; i < 11088; i++) { arr[i] = div(); }
  13. WebAssembly + JS 37 (module (func $i (import "imports" "logger")

    (param i32)) (memory (import "imports" "importedMemory") 1) (func (export "exportedFunc") i32.const 42 call $i) (func (export "add") (param i32 i32) (result i32) local.get 0 local.get 1 i32.add) (data (i32.const 0) "dragon")) const importedMemory = new WebAssembly.Memory({ initial: 1, maximum: 10 }); WebAssembly.instantiateStreaming(fetch("simple.wasm"), { imports: { logger: function(arg) { console.log("first function call", arg); }, importedMemory } }).then(obj => { obj.instance.exports.exportedFunc(); const three = obj.instance.exports.add(1, 2); console.log("1 + 2 =", three); var memoryArray = new Uint32Array(importedMemory.buffer, 0, 10); console.log( "reading from memory", new TextDecoder("utf8").decode(memoryArray) ); });
  14. 38 Не то чтобы минусы… но все же Большие размеры

    .wasm-файликов Отдельный этап подготовки Все медленно для языков с GC Нет SIMD (Single Instruction Multiple Data) Нет потоков MVP
  15. 39 WebAssembly в моем проекте Хочу портировать существующий код не

    на JS Там т-а-а-а-кие бенчмарки! WebAssembly это модно! Большая часть нашей системы должна быть быстрой, мы уже оптимизировали все что могли