24

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

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

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

4

8 回答 8

50

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

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

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

于 2012-08-30T11:45:42.147 回答
25

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

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

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

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

于 2013-09-04T19:01:46.083 回答
9

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

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

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

于 2012-08-30T11:55:16.063 回答
7
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

于 2017-01-01T17:32:28.517 回答
4

我已经运行了@denshade 代码来删除打印,并且 100000 个数字的时间非常特殊:

  • 3 秒。对于nodejs!

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

  • 6 秒。对于 hhvm ( php )

  • 带 opcache 的 php7 需要14 秒

  • 15 秒for php7 w/o opcache

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

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

于 2016-03-03T16:17:08.583 回答
3

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

于 2016-03-04T14:52:16.040 回答
0

以下是 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

于 2016-03-04T14:22:16.463 回答
-1

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

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

于 2013-08-25T19:31:39.327 回答