Когда asm.js быстрее обычного кода JS, зачем писать новый код в JS?

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

Я читал FAQ Emscripten, он говорит: "Обязательно напишите новый код JavaScript". Почему это?

Ответ 1

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

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

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

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

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

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