Подтвердить что ты не робот

Node.js vs С++ для математического

Мне нужно написать серверную программу, которая реализует некоторую нечеткую логику, и я хочу написать ее в Node.js, чтобы воспользоваться ее ориентацией на события. Мне приходится работать со сложной математической вычислительной проблемой, и я не знаю, что лучший способ получить производительность:

  • Запишите все в Node.js и используйте мощность двигателя V8 для математической задачи.
  • Напишите модуль на С++, который реализует всю математическую функцию и вызывает ее из Node.

Кто-нибудь, у кого есть опыт в этих типах вычислений на обеих платформах?

4b9b3361

Ответ 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 настолько быстр, что скомпилирован и оптимизирован с течением времени.

возможно, вам просто нужно проверить себя, что является лучшим языком, который соответствует вашим потребностям в этом случае.

Ответ 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