【问题标题】:Node.js vs C++ for mathematic用于数学的 Node.js 与 C++
【发布时间】:2012-08-25 02:53:17
【问题描述】:

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

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

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

【问题讨论】:

  • 用 c++ 编写它显然会更快(如果编写正确的话)。这实际上取决于可接受的性能水平。也许先尝试在 node.js 中编写它,然后对其进行分析以查看它是否是瓶颈。
  • “使用V8引擎的力量”让我笑了。
  • 如果你要做 2+2,相信我节点会处于最佳状态。但是,如果您要进行大型矩阵操作,建议使用 C 或 C++。我相信你明白我的意思。
  • 两者都可以 - nodejs.org/api/addons.html
  • 2+2 可能并不意味着节点是最佳选择。

标签: c++ performance node.js math computation


【解决方案1】:

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

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

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

【讨论】:

  • 同意 100%。大约一周前,我读了一篇文章,显示 JavaScript 在某些数字代码上的性能明显优于 Java。很难预测 JIT 编译器或解释器在哪些情况下会表现良好。但总是从可能有效的简单方法开始。几乎可以肯定的是,您可以比 C++ 实现更快地启动和运行 Javascript 实现。所以从它开始,如果你必须用 C++ 重新实现它
  • @jalf 我会说,预测 jit 去优化并不难,但很难调试错误。 Javascript 现在没有用于此类任务的便捷工具。您可以查看调试跟踪,但这很无聊。如果您有非常复杂的库或需要 64 位整数/双浮点数 - 直接绑定到 C/C++ 会更快。但对于简单的情况,我同意先写 js 更佳。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:
      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

      【讨论】:

        【解决方案5】:

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

        • 3 秒。 对于 nodejs!

        • 6 秒,用于 gcc/clang 编译的 c

        • 6 秒。对于 hhvm ( php )

        • 14 秒 for php7 w/ opcache

        • 15 秒 for php7 w/o opcache

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

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

        【讨论】:

        • 感谢您的信息 (-:
        • NodeJS 的问题是您没有适当的多线程支持,但出于这个原因,您始终可以使用工作进程/子进程。根据您的需要。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

            • 我只是逐字运行您的代码,但没有打印语句并获得了 565 秒......也许 printf() 中的 I/O 缓冲比 sys.stdout.write 更严格?此外,如果 C 代码花费了很长时间,那么您的测试可能主要测试 IO,这可能不是您想要的。
            • 是的,如果素数都输出到控制台,这个测试是没有用的。真正的比较只涉及计算 n 个素数。我使用 cout 与 printf() 进行了相同的测试,而 printf() 的性能要好得多。这个测试是有缺陷的,因为它的测量包括 JavaScript 的 process.stdout.write() 和 C 的 printf() 的性能。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-02
            • 2011-04-14
            • 2011-05-28
            • 1970-01-01
            • 1970-01-01
            • 2018-03-05
            相关资源
            最近更新 更多