Почему asm.js быстрее, чем обычный код JS, почему я должен писать новый код в JS?

Emscripten может генерировать более быстрый код из C / C ++, чем JS-код, написанный вручную, так значит ли это, что мы должны написать новый код на C / C ++ и скомпилировать их для работы в Web?

Я прочитал часто задаваемые вопросы по Emscripten, там написано: «Во что бы то ни стало, пишите новый код JavaScript». Почему?

10

Решение

asm.js не является быстрым способом выполнения кода на языке Javascript. Это более быстрый способ запуска кода, который уже сведен к уровню абстракции машинного кода. Вы, кажется, сильно переоцениваете достижения:

  • Если вы позволите JS-разработчикам писать на C ++ так, как если бы это был JS, вы получите неуклюжий код, который не так быстр, как C ++, и может иметь и другие недостатки.
  • Многие потенциальные узкие места, такие как манипулирование DOM и сетевая задержка, никак не зависят от скорости выполнения вашего кода.
  • Для многих программ ускорение от более быстрой языковой реализации замедляется ускорением высокоуровневых оптимизаций. Другими словами, делать работу несколько быстрее — это хорошо, но не делать это вообще быстрее.

Переход по этому маршруту также имеет существенные недостатки:

  • Ты должен выбросить ваш рабочий код и переписать его (включая ошибки) на языке, который большинство вашей команды не будет знать почти так же, если вообще.
  • На данный момент технология все еще находится в зачаточном состоянии. Вы бы не поставили на это свою компанию или даже важный продукт. Даже если это удастся, это всегда будет нишевая технология по сравнению с JavaScript. Это не дисквалифицирует это для профессиональной работы, но это будут сделать много вещей сложнее.
  • IIUC, вы не можете напрямую делать большинство вещей, которые JS может делать, кроме обработки чисел, вы можете только вызывать функции JS, явно предложенные модулю asm.js. То есть вам всегда понадобится хотя бы куча связующего кода в Javascript, и (как уже упоминалось выше), если это касается ваших узких мест, вы на самом деле ничего не получили.

Единственный вид кода, который я ожидаю получить от asm.js достаточно:

  • Существующий код, который еще не написан на JavaScript. По единственной причине, чтобы сэкономить вам большую часть хлопот портирования.
  • Тяжелый хруст числа, не взаимодействующий с браузером. (Подумайте: как часто вы это делаете? И действительно ли вы хотите написать его на C / C ++ и связать его с JS?)
  • Материал, который по своей природе находится на уровне абстракции, поддерживаемой asm.js, например, компиляторы, испускающие инструкции машинного кода.
12

Другие решения

Других решений пока нет …