Pull to refresh

Comments 33

UFO just landed and posted this here
Сначала они доделают Минимально Жизнеспособный Продукт, а после этого займутся менее приоритетными фичами, к которым отнесли DOM — http://webassembly.org/docs/future-features/
Пример игры http://webassembly.org/demo/

Пока подразумевается что wasm объект подключается к js и работа с ним ничем не отличается от обычного js

Нужно активировать в браузере поддержку
В хроме открыть chrome://flags/#enable-webassembly
В файрфоксе about:config и там найти javascript.options.wasm

WebAssembly доступен только в ночных сборках.

Уже давно в основной ветке и хрома и файрфокса под флагом, нужно только включить

Включил, но все равно WebAssembly undefined.

Если бы не было поддержки, то не было бы и флага который можно было бы включить
В хроме 55 и файрфоксе 50 флаг включается и официальная wasm демка работает

В хроме нужно браузер перезагрузить, в файрфоксе не надо
В основной ветке Хрома я получил
WebAssembly.compile(): Wasm decoding failedResult = expected version 0c 00 00 00, found 0d 00 00 00 @+4
Нужна именно канарейка похоже.
Все верно, для этого wasm (версия из статьи) нужна канарейка, а сам wasm в основной ветке работает нормально, потому что запускается эта демка
http://webassembly.org/demo/

Сразу бросились в глаза 2 ошибки производительности в fiboJsMemo


  • нельзя переопределять аргументы
  • нельзя динамически добавлять свойства к объекту

Почему автор не написал этот вариант также как и си. Не умышленно ли часом?


const memo = new Array(10000);
function fiboJsMemoOpt (num) {
  if (num <= 1) return 1;
  const x = memo[num];
  if (x !== void 0) {
    return x;
  }
  return memo[num] = fiboJsMemoOpt(num - 1) + fiboJsMemoOpt(num - 2);
}

Js x 11,501,607 ops/sec ±2.53% (70 runs sampled)
Js memoization x 465,102 ops/sec ±0.82% (86 runs sampled)
Js memoization opt x 59,388,502 ops/sec ±2.89% (82 runs sampled)

Главное, проценты у авторa получились красивые.

UFO just landed and posted this here
Согласен с вашим комментарием, только разве что оптимизация с void 0 уже не требуется, разницы между

  const x = memo[num];
  if (x !== void 0) {
    return x;
  }

и

  if (memo[num]) 
    return memo[num];
  }

никакой нет
fiboJsMemoOptVar1: 8.424ms
fiboJsMemoOptVar2: 7.873ms
Перепроверил, показалось странным, так как обе функции на текущем v8 движке должны работать одинаково, обе они успешно оптимизируются и странно, что такая большая разница между вашей функций и из топика.

В итоге нужна 1 единственная маленькая корректировка в оригинальную функцию и разница практически не будет

fiboJsMemoOpt: 77.259ms
fiboJsMemoMyMods: 88.285ms

В оригинале вместо
memo = memo || {};

надо написать (что в данном случае намного правильнее чем {})

memo = memo || [];

И производительность вырастает
Самое интересное то, что смотреть на результаты эти не имеет смысла. Во-первых си-код не валиден, ибо всегда будет возвращать ноль. Во-вторых что измеряет memoization? Ничего. Чтение значения из памяти.

Почему автор не написал этот вариант также как и си. Не умышленно ли часом?

Ну вы нашли типичную причину проблем жаваскрипта — непредсказуемость. Почему не написал? Спорный вопрос, но факт есть факт — никаких причин к замдлению в 100раз нет.

Главное, проценты у авторa получились красивые.

Результаты васма вы не показали. Да и это ничего не меняет, только то, что васм не особо отличается от ЖС и его нативность лишь миф. Результаты в 60кк вызовов(в секунду) функций с одним обращением к «памяти» просто смешны.

А так же важно то, что ни цикл с одной операцией, ни обращение к памяти — ни есть то, что имеет смысл сравнивать. Наиболее близкая к реальности реализация — это рекурсия. Ведь большинство кода на том же жс есть не более чем вызов примитивных функций в гигантских кол-вах.

А если надо получить число фибонначи при n = 10001?
То можно сделать так:


где — золотое сечение.

Но пост же не об этом.
Я конечно не специалист, но почему C, C++, Rust, Swift — низкоуровневые языки?

В сравнении с JS, конечно же.

return memo[n] = fibonacciMemo(n - 1) + fibonacciMemo(n - 2);

что бы мемоизация работала, разве не надо так
fibonacciMemo(n - 2) + fibonacciMemo(n - 1);
разве сначала не левый, а затем правый операнд вызывается?
На этой странице, кстати, вы можете попробовать всё сами.
Я получаю ошибку в консоли:
bundle.js:66 Uncaught (in promise) ReferenceError: WebAssembly is not defined
at fetch.then.then.buffer (bundle.js:66)

Нужно активировать в браузере поддержку
В хроме открыть chrome://flags/#enable-webassembly
В файрфоксе about:config и там найти javascript.options.wasm
В edge и safari тоже есть поддержка, не знаю как там включается

UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Лол. У вас карма головного мозга?
Как часто вы считаете числа Фибоначчи в JS'e?
Тест очень синтетический и не показывает абсолютно ничего.
Интересно еще сравнить с pnacl.
Как убить интерес к теме? Начните с чисел Фибоначчи.
Sign up to leave a comment.