假设我在c ++或c中有一个简单的hello world文件(无论是什么都可以帮助我在node.js中更容易使用它,更喜欢c)并希望从node.js文件中运行它。考虑到该文件将用于提高性能(从node.js更改为c / c ++的CPU密集型函数),最有效的方法是什么。
我遇到了addons,但在我看来,为了使用它,我必须转换大量代码才能将其转换为该格式。有更简单的方法吗?
答案 0 :(得分:1)
对于我在C++
中编写的图像分割算法,我需要帮助全栈开发人员包装node.js
的共享库。据我所知,从谷歌的一天到黑客入侵node.js
,对我来说这是一个有点陌生的世界,有两个主要选择:
node-ffi
,或addons
正如您已经说过的那样。对于上面的1.你不需要做太多。您只需要ffi
中的ref
,ref-array
和node.js
个包/插件,就可以调用应用程序代码的C API。我遵循了一些nice tutorial,这帮助我在15分钟内开始行动。
但是,我最终需要为我们的项目选择2.以上。这是因为我们的全栈开发人员依赖于需要最新版node.js
的其他一些插件。显然,当我们检查node-ffi
的问题解答时,截至此回答的发布时间,它确实不支持v9.x
node.js
个系列。因此,我采用原生插件的方式。我花了大约4个小时来理解和编写代码。我不确定它是否是最方便/最有效的方式,但我做的是
node.js
,nan
中的node.js
编写一个简单的插件reinterpret_cast
char*
node.js
binding.gyp
缓冲区,并调用我们共享库的相同C API ,最后,nan
创建的共享库。显然,Node.js的Native Abstractions(aka v8
)应该被用户使用,以避免处理node-ffi
中引入的重大更改的需要。我找到了另一个nice tutorial,这有助于我轻松解决我的问题。
最后,Scott Frees'对于那些想要更深入的人来说,博客网站似乎有很多自成一体的文章/例子。他还argues在哪种情况下你应该更喜欢一种方法而不是另一种方法(例如,node-ffi
优于本地插件)。基本上,我理解的是,编写本机插件会更有效,即使对于我们的应用程序来说也没那么重要。 nan
也提供了令人满意的行为,因为我们正在解决图像分割问题(无论如何都需要比调用开销更多的时间)。
所以,简而言之,
我遇到了插件,但在我看来,为了使用它,我必须转换大量代码才能将其转换为该格式。
嗯,不一定!这取决于你愿意实现的目标。它可以像为特定的C-API共享库编译C ++代码一样简单,然后在reinterpret_cast
中编写一个20行的包装器,基本上为就地内存操作执行一些binding.gyp
,最后在node-ffi
中链接到库。
有更简单的方法吗?
是的,有。 v9.x
可以帮助您在半小时内解决问题。但是,可能对您的方案来说不是最有效的,或者可能对您来说不是一个可行的选项,因为它目前不构建{{1} node.js
的家人。
答案 1 :(得分:1)
我不明白为什么使用child_process比其他选项要慢, 我建议:
// myCFile.c
#include <stdio.h>
int main(void){
// processor intensive computations
int x = 1+2+3;
// send to node via stdout
printf("%d", x);
//terminate the process
return 0;
}
编译:
$ gcc -o myExecutable myCFile.c
并像这样使用child_process:
//myNodeFile.js
const { exec } = require("child_process");
exec("./myExecutable", (error, stdout, stderr) => console.log(stdout));