假设我在node.js中编写程序(或者可能是另一种典型的后端脚本语言)。假设我有一个C函数f
(或python函数,或者你有什么)做一些纯数据转换。
如果我想在我的节点程序中使用f
,有两种方法:
f
,使其可以从JavaScript域调用。f
放入文件系统中的二进制文件(或者,如python之类的语言,单个f.py
接口),然后从节点调用它,就好像是其他系统命令(以便可以将系统调用的输出作为字符串,将其转换为node.js数据,然后使用它)。问题:选择(2)超过(1)有什么性能影响?
这很重要,因为如果你使用像C这样的语言来使你的应用程序的某些方面运行得更快,那么使用(2)似乎没有意义,如果它减慢了一些阈值。
答案 0 :(得分:1)
成本为1是加载本机代码,传输参数(ffi),调用本机代码以及传回参数的成本。加载只进行一次。
2的成本始终是启动流程,运行流程,将结果从字符串转换回来的成本。
如果f
的成本很高,您可能永远不会看到1和2之间的差异。如果f
的成本很低,那么2将花费更长时间,因为流程启动开销将占主导地位
但是,根据f
的复杂性(它可能是C中非常大的数据处理应用程序),创建本机绑定几乎总是更快。避免进程启动开销很重要,它还减少了运行应用程序所需的总内存量。
或者你可以选择:
如果需要,可以扩展到多个节点。
答案 1 :(得分:1)
对于您的用例进行基准测试是确定但方法1的唯一方法 可能会更快。
调用二进制文件并为python / perl / blah启动解释器的启动成本可能会破坏使用其外部函数接口(FFI)可能获得的任何性能提升。启动成本是Apache拥有mod_python,mod_perl以及为什么存在FastCGI的原因之一。
另一件需要考虑的事情是,你要添加另一种语言,这可能会杀死团队的表现,即现在每个人都需要知道两种语言和两种FFI方法等。如果你的应用程序在Node中,将其保存在Node中并使用node调用本机方法。