[英]Run c/c++ code from nodejs
假設我在c ++或c中有一個簡單的hello world文件(無論如何,它將幫助我在node.js中更輕松地使用它,最好是c),並希望從node.js文件中運行它。 考慮將文件用於提高性能的最有效方法是什么(將CPU密集型功能從node.js更改為c / c ++)。
我遇到了插件,但在我看來,要使用它,我必須轉換很多代碼才能將其轉換為這種格式。 有更容易的方法嗎?
我不明白為什么使用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));
對於我用C++
編寫的圖像分割算法,我需要幫助全棧開發人員包裝node.js
的共享庫。 據我所知,從Google到處闖入node.js
的那一天開始(這對我來說是一個陌生的世界),有兩種主要選擇:
node-ffi
,或者 addons
。 對於上述1.,您不需要做很多事情。 您只需要在node.js
要求ffi
, ref
和ref-array
軟件包/附加程序就能調用您的應用程序代碼的C API。 我遵循了一些不錯的教程 ,它幫助我在15分鍾內開始學習。
但是,最后我需要為我們的項目選擇2。 這是因為我們的全棧開發人員依賴其他一些需要最新版本的node.js
插件。 顯然,當我們檢查的問題板node-ffi
,作為這個答案的發帖時間,它不支持v9.x
家庭node.js
。 因此,我采用了原生插件方式。 我花了大約4個小時來理解和編寫代碼。 我不確定這是否是最方便/最有效的方法,但是我所做的是
node.js
分配內存, nan
在node.js
說reinterpret_cast
S上的char*
緩沖node.js
並調用共享庫的非常相同的C API,最后, binding.gyp
創建的共享庫。 顯然,用戶應該使用Node.js的本機抽象(又名nan
),以避免需要處理v8
引入的重大更改。 我找到了另一個不錯的教程 ,它可以幫助我輕松解決問題。
最后, 斯科特·弗里斯 ( Scott Frees)的博客網站似乎為那些想深入的人提供了許多獨立的文章/示例。 他還指出,在哪種情況下,您應該首選一種方法而不是另一種方法(例如, node-ffi
優於本機插件)。 基本上,我的理解是,即使對於我們的應用程序來說,編寫本機附加組件也沒什么大不了的。 在解決圖像分割問題時, node-ffi
行為也令人滿意(總之,它比調用開銷要花費更多的時間)。
簡而言之,
我遇到了插件,但在我看來,要使用它,我必須轉換很多代碼才能將其轉換為這種格式。
好吧,不一定! 這取決於您願意實現的目標。 就像為特定的C-API共享庫編譯C ++代碼,然后在nan
編寫一個20層的包裝器一樣簡單,該包裝器實際上對就地內存操作做了一些reinterpret_cast
,最后在binding.gyp
與該庫鏈接binding.gyp
。
有更容易的方法嗎?
就在這里。 node-ffi
可以在半小時內幫助您解決問題。 但是,這對於您的方案而言可能不是最有效的,或者對於您而言可能不是一個可行的選擇,因為它當前未使用v9.x
系列的node.js
構建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.