Как стать автором
Обновить

Комментарии 33

Как работать с DOM/BOM?

НЛО прилетело и опубликовало эту надпись здесь
Сначала они доделают Минимально Жизнеспособный Продукт, а после этого займутся менее приоритетными фичами, к которым отнесли DOM — http://webassembly.org/docs/future-features/
Пример игры http://webassembly.org/demo/

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

ReferenceError: WebAssembly is not defined

Нужно активировать в браузере поддержку
В хроме открыть 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 получились красивые.

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

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Не нойте.
НЛО прилетело и опубликовало эту надпись здесь
Лол. У вас карма головного мозга?
Как часто вы считаете числа Фибоначчи в JS'e?
Тест очень синтетический и не показывает абсолютно ничего.
Интересно еще сравнить с pnacl.
Как убить интерес к теме? Начните с чисел Фибоначчи.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий