Node.js vs С++ для математического
Мне нужно написать серверную программу, которая реализует некоторую нечеткую логику, и я хочу написать ее в Node.js, чтобы воспользоваться ее ориентацией на события.
Мне приходится работать со сложной математической вычислительной проблемой, и я не знаю, что лучший способ получить производительность:
- Запишите все в Node.js и используйте мощность двигателя V8 для математической задачи.
- Напишите модуль на С++, который реализует всю математическую функцию и вызывает ее из Node.
Кто-нибудь, у кого есть опыт в этих типах вычислений на обеих платформах?
Ответы
Ответ 1
Так как вам нужна часть Node.js, продолжайте, реализуйте все в Node.js. Если он достаточно быстрый, его достаточно просто поддерживать. Очень сложно предсказать мощь компилятора виртуальной машины /JIT.
Если это не достаточно быстро, сначала подумайте об улучшении алгоритма. Если это не помогает, и если профилирование показывает, что вычисление является проблемой, продолжайте, повторите его реализацию на С++. Но имейте в виду, что писать исполняемый код С++ не является тривиальным. Убедитесь, что у вас хороший профилировщик и часто его измеряйте.
В общем, я бы сказал, что код С++ быстрее, если он написан правильно. Трудная часть - написать его правильно. Для получения дополнительной информации см. Статью Google Paper на С++, Java, Scala, Go. Основа - управляемые языки упрощают запись и поддержку кода, но если вам нужна необработанная производительность, С++ - лучшая. Но это связано с тем, что вам нужно много опыта и что код сложнее поддерживать.
Ответ 2
denshade, ваша реализация C идет только на 2e5, а не на 2e6, как вы сделали для js (ссылка на сегодняшний день на Github):
Ввод в /dev/null и изменение js также на 2e5, я получаю около 6.5 секунд для C и около 8.5 секунд для js (используя некоторую версию node) на моем текущем компьютере.
Поскольку ваш алгоритм O (n ^ 2), я ожидал бы, что 2e6 займет около 15 минут, а не 15 часов, но я не пробовал. Может быть, это по какой-то причине разваливается.
(Обратите внимание, что я не мог комментировать напрямую, так как я новичок в SO и не имею репутации.)
Ответ 3
это почти невозможно ответить на этот вопрос. Ответ, как всегда, на все это зависит от ваших навыков и количества времени и усилий, которые вы готовы вложить в него.
С++ всегда имеет потенциал быть более быстрым и эффективным, так как вы гораздо ближе контролируете все, что имеет значение. Недостатком этого является то, что вы должны делать все, что имеет значение, и общие реализации на другом языке, вероятно, сделаны кем-то, кто знает, что они делают, и может быть лучше, чем наивная или быстрая реализация в С++
Плюс часто вы обнаружите, что узкое место не то, что, по вашему мнению, будет в любом случае, например, если чтение в ваших данных окажется в 20 раз до тех пор, пока вычисления не будут невозможны, тогда это вряд ли имеет значение насколько быстрыми являются расчеты. И интуиция о том, где лежат узкие места, часто плохо ошибочна даже для опытных разработчиков.
Ответ 4
Одна вещь, которую следует учитывать при переходе на С++-маршрут для сложных математических вычислений, - это то, что вы можете использовать существующую высокопроизводительную библиотеку, такую как BLAS, LAPACK, ARMA и т.д., где другие разработчики уже приложили немало времени и усилий для обеспечения высоко оптимизированной функциональности. Я сомневаюсь, что вы найдете аналогичный уровень библиотеки высокой производительности для JavaScript. Конечно, если у вас есть выявленное узкое место вокруг матричных вычислений или линейной алгебры, одна из этих библиотек С++ - это путь.
Ответ 5
Если ваши вычисления не являются тривиальными, я хотел бы выпустить предупреждение. JavaScript очень плох, когда вы собираетесь выполнять большие вычисления. Моя история включает в себя простую премьер-программу, которую вы можете найти здесь: https://github.com/denshade/speedFun
Короче говоря. Я создал простую, будь то неэффективную функцию первичной проверки, реализованную в C и JavaScript. Оба реализуются одинаково. Первые 2000 000 простых чисел проверяются через 5 секунд в C. Эта же функция в javascript длилась более 16 часов при запуске в node.js.
Ответ 6
Я запустил коды @denshade, удаляя отпечатки, и время на 100000 номеров является исключительным:
-
3 сек. для nodejs!
-
6 сек. для gcc/clang скомпилировано c
-
6 секунд. для hhvm (php)
-
14 сек для php7 w/opcache
-
15 секунд для php7 без opcache
Nodejs настолько быстр, что скомпилирован и оптимизирован с течением времени.
возможно, вам просто нужно проверить себя, что является лучшим языком, который соответствует вашим потребностям в этом случае.
Ответ 7
http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=gpp
С++ использует процессор и выполняет до 10 раз быстрее, чем Node.js выполняет математические операции.
Ответ 8
Ниже приведены области, в которых Node.js доказывает себя как совершенная технология
партнер.
● I/O bound Applications
● Data Streaming Applications
● Data Intensive Real-time Applications (DIRT)
● JSON APIs based Applications
● Single Page Applications
Не рекомендуется использовать Node.js для приложений с интенсивным процессором.
здесь сопоставление API:
https://www.linkedin.com/pulse/nodejs-vs-java-which-faster-apis-owen-rubel