【问题标题】:What is the best way to make use of native code in nodejs?在 nodejs 中使用本机代码的最佳方法是什么?
【发布时间】:2020-10-11 02:47:51
【问题描述】:

我正在使用 nodejs/electron 开发一个应用程序,该应用程序必须处理大量数据,并用 c++ 编写了它的性能关键部分。现在应用程序的大部分已经完成,我仍然不确定调用 c++ 代码的最佳方式。看来最自然的方式是编译成共享库,然后从nodejs调用,但对我来说这个过程似乎太复杂了,所以我想把c++代码做成一个独立的可执行文件,监听一个端口号,然后从我的 nodejs 应用程序向它发送 tcp 请求。

那么问题是:这会影响性能吗?这是一个糟糕的设计选择吗?

谢谢

【问题讨论】:

    标签: c++ node.js sockets tcp electron


    【解决方案1】:

    您有多种选择:

    1. 将您的代码放入它自己的应用程序并锻炼一种方法来传递您希望它处理的内容(通过 cmdline 参数、文件、stdio、网络等),然后通过 child_process 从 node.js 运行它模块。

    2. 使用add-on SDK 将您的代码放入nodejs 插件中,这样您就可以在nodejs 中直接调用它。

    3. 将您的代码编译为 web-assembly 并直接从 nodejs 中加载/运行该 Web 程序集。如果您以前没有听说过 Web 组装,那么它是 Javascript 引擎中的一项相当新的功能。 Rust 或 C 或 C++ 之类的语言将其代码编译为 Web 程序集目标。它有点像 Javascript 引擎可以直接运行的低级通用(非 CPU 特定)汇编语言,其他类型语言(如 Rust、C 或 C++)可以直接编译,就像它们编译为本机机器语言一样特定的编译器目标。然后,JS 引擎获取该 Web 程序集并将其即时编译为本地机器语言,同时添加一些内存访问保护措施。

    所以我考虑让 c++ 代码成为一个独立的可执行文件,监听一个端口号,然后从我的 nodejs 应用程序向它发送 tcp 请求。

    这样就好了。

    那么问题是:这会影响性能吗?这是一个糟糕的设计选择吗?

    很难知道您的绩效目标是什么。您可能不希望某些以快速方式调用数千次的操作位于单独的服务器中,但如果您调用它的频率低于此值,那么它可能会很好。

    nodejs 附加 SDK 为您提供了一个相当高带宽的 Javascript 接口,因为它与许多 nodejs 内置库的实现方式相同。学习它是如何工作的需要更多的工作,因为如果你要在 node.js 中进行进程内并使用垃圾收集,你必须以某种方式做很多事情(特别是任何处理内存或传递的事情数据传入/传出 Javascript)。但是,它最终是与您的 nodejs Javascript 的最紧密连接。

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多