通过系统调用与其他语言交互的性能影响是什么?

时间:2016-03-18 18:51:53

标签: node.js interop

假设我在node.js中编写程序(或者可能是另一种典型的后端脚本语言)。假设我有一个C函数f(或python函数,或者你有什么)做一些纯数据转换。

如果我想在我的节点程序中使用f,有两种方法:

  1. 通过类似node-gyp的东西绑定f,使其可以从JavaScript域调用。
  2. f放入文件系统中的二进制文件(或者,如python之类的语言,单个f.py接口),然后从节点调用它,就好像是其他系统命令(以便可以将系统调用的输出作为字符串,将其转换为node.js数据,然后使用它)。
  3. 问题:选择(2)超过(1)有什么性能影响?

    这很重要,因为如果你使用像C这样的语言来使你的应用程序的某些方面运行得更快,那么使用(2)似乎没有意义,如果它减慢了一些阈值。

2 个答案:

答案 0 :(得分:1)

成本为1是加载本机代码,传输参数(ffi),调用本机代码以及传回参数的成本。加载只进行一次。

2的成本始终是启动流程,运行流程,将结果从字符串转换回来的成本。

如果f的成本很高,您可能永远不会看到1和2之间的差异。如果f的成本很低,那么2将花费更长时间,因为流程启动开销将占主导地位

但是,根据f的复杂性(它可能是C中非常大的数据处理应用程序),创建本机绑定几乎总是更快。避免进程启动开销很重要,它还减少了运行应用程序所需的总内存量。

或者你可以选择:

  1. 让C代码通过本地网络套接字进行通信。在计算完成时接受请求并回答答案。
  2. 如果需要,可以扩展到多个节点。

答案 1 :(得分:1)

对于您的用例进行基准测试是确定但方法1的唯一方法 可能会更快。

调用二进制文件并为python / perl / blah启动解释器的启动成本可能会破坏使用其外部函数接口(FFI)可能获得的任何性能提升。启动成本是Apache拥有mod_python,mod_perl以及为什么存在FastCGI的原因之一。

另一件需要考虑的事情是,你要添加另一种语言,这可能会杀死团队的表现,即现在每个人都需要知道两种语言和两种FFI方法等。如果你的应用程序在Node中,将其保存在Node中并使用node调用本机方法。