繁体   English   中英

Node.js 与 C++ 的数学

[英]Node.js vs C++ for mathematic

我必须编写一个实现一些模糊逻辑的服务器程序,我选择在 Node.js 中编写它以利用其面向事件的优势。 我必须处理困难的数学计算问题,我不知道获得性能的最佳方法是什么:

  1. 全部用 Node.js 编写,并使用 V8 引擎的强大功能来完成数学任务。
  2. 用 C++ 编写一个实现所有数学函数的模块,并从 Node.js 调用它。

任何在这两个平台上都具有此类计算经验的人?

由于无论如何您都需要 Node.js 部分,请继续,在 Node.js 中实现所有内容。 如果它足够快,这很容易维护。 很难预测虚拟机/JIT 编译器的能力。

如果还不够快,首先考虑算法改进。 如果这没有帮助,并且如果分析表明计算是问题,请继续,用 C++ 重新实现它。 但请注意,编写高性能 C++ 代码并非易事。 确保您手头有一个好的分析器并经常测量。

一般来说,如果编写正确,我会说 C++ 代码会更快。 棘手的部分是正确编写它。 请查看这篇关于 C++、Java、Scala、Go 的 Google 论文以获取更多信息。 要点是 - 托管语言使编写和维护代码变得更加容易,但是如果您需要原始性能,C++ 是最好的。 但它的代价是需要大量的专业知识,而且代码更难维护。

denshade,您的 C 实现仅适用于 2e5 而不是 2e6,就像您为 js 所做的那样(链接到今天在 Github 上的 revs):

管道到 /dev/null,并将 js 也更改为 2e5,我在我当前的计算机上得到大约 6.5 秒的 C 和大约 8.5 秒的 js(使用某些版本的节点)。

由于您的算法是 O(n^2),我预计 2e6 需要大约 15 分钟,而不是 15 小时,但我还没有尝试过。 也许出于某种原因,它确实崩溃了。

(请注意,我无法直接发表评论,因为我是全新的 SO 并且没有代表。)

回答这种问题几乎是不可能的。 这些事情的答案一如既往地取决于您的技能以及您愿意投入多少时间和精力。

C++ 总是具有更快、更高效的潜力,因为您可以更密切地控制所有重要的事情。 不利的一面是,您必须做所有重要的事情,而其他语言中的通用实现可能是由知道自己在做什么的人完成的,并且可能比 C++ 中的幼稚或快速实现要好

此外,您经常会发现瓶颈并不是您认为的那样,例如,如果读取数据的时间是计算的 20 倍,这并非不可能,那么计算速度有多快几乎无关紧要。计算是。 即使对于有经验的开发人员来说,关于瓶颈所在的直觉也常常是错误的。

http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=gpp

上面的链接已经死了,现在回不去了--

https://web.archive.org/web/20180324192118/http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=node&lang2=gpp

C++ 使用 CPU,执行数学运算的速度比 Node.js 快 10 倍。

该网站移至此处https://benchmarksgame-team.pages.debian.net/benchmarksgame/which-programs-are-fastest.html

我已经运行了@denshade 代码来删除打印和 100000 个数字的时间是例外:

  • 3 秒。 对于 nodejs!

  • 6 秒。 对于 gcc/clang 编译的 c

  • 6 秒 对于 hhvm ( php )

  • 带有 opcache 的 php7 需要14 秒

  • 没有opcache 的 php7 需要15 秒

Nodejs 之所以如此之快,是因为它是随着时间的推移而编译和优化的。

所以,也许你只需要自己测试一下,在这种情况下,哪种语言最适合你的需求。

使用 C++ 进行复杂数学计算时要考虑的一件事是,您可能能够利用现有的高性能库,例如BLAS 、LAPACK、ARMA 等。其他开发人员已经投入大量时间和精力来提供高度优化的功能。 我怀疑您会为 JavaScript 找到类似级别的高性能库。 当然,如果您在矩阵计算或线性代数方面遇到了瓶颈,那么这些 C++ 库之一就是您要走的路。

以下是 Node.js 证明自己是完美技术合作伙伴的领域。

● I/O bound Applications
● Data Streaming Applications
● Data Intensive Real-time Applications (DIRT)
● JSON APIs based Applications
● Single Page Applications

不建议将 Node.js 用于 CPU 密集型应用程序。

这是 API 比较: https : //www.linkedin.com/pulse/nodejs-vs-java-which-faster-apis-owen-rubel

如果您的计算不重要,我想发出警告。 当您进行大量计算时,JavaScript 非常糟糕。 我的故事涉及一个简单的素数程序,你可以在这里找到: https : //github.com/denshade/speedFun

长话短说。 我创建了一个简单的,在 C 和 JavaScript 中实现的低效素数检查函数。 两者都以相同的方式实现。 前 2000 000 个素数在 C 中在 5 秒内验证。 javascript 中的相同函数在 node.js 中运行时持续了 16 多个小时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM