node.js 的 c++ 插件的速度
Posted
技术标签:
【中文标题】node.js 的 c++ 插件的速度【英文标题】:speed of c++ addons for node.js 【发布时间】:2020-12-11 21:45:25 【问题描述】:我在 c++ 和 node.js 上编写了两个类似的代码,它们只适用于字符串。我在 .js 文件中有这个:
//some code, including f
console.time('c++');
console.log(addon.sum("123321", s));
console.timeEnd('c++');
console.time('js');
console.log(f("123321", s));
console.timeEnd('js');
我的 c++ 插件看起来像这样:
//some code, including f
void Sum(const v8::FunctionCallbackInfo<v8::Value>& args)
v8::Isolate* isolate = args.GetIsolate();
v8::String::Utf8Value str0(isolate, args[0]);
v8::String::Utf8Value str1(isolate, args[1]);
string a(*str0), b(*str1);
string s2 = f(a, b);
args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, s2.c_str()).ToLocalChecked());
但问题是c++的运行速度比js慢了近1.5倍,尽管js上的函数有一些可以优化的部分(我没有写得很准确)。 在控制台中我得到
@uTMTahdZ22d!a_ah(3(_Zd_]Zc(tJT[263mca!(jcT[20_]h0h_06q(0jJ(T]!&]qZM]d_30j&Tuj2hm[Z0d@!32ccT2(!dud@6]0MdJc]mta!3]j]_(hhJqha(([
c++: 7.970s
@uTMTahdZ22d!a_ah(3(_Zd_]Zc(tJT[263mca!(jcT[20_]h0h_06q(0jJ(T]!&]qZM]d_30j&Tuj2hm[Z0d@!32ccT2(!dud@6]0MdJc]mta!3]j]_(hhJqha(([
js: 5.062s
所以,函数的结果是相似的,但是 JS 程序运行得快了很多。怎么会这样? c++ 不应该比 JS 快(至少不慢很多)?也许我没有考虑到一个重要的细节,它让 c++ 变慢了这么多,或者在 c++ 中处理字符串真的很慢?
【问题讨论】:
用纯 C++ 编写,而不是作为 notejs 的插件。就像现在一样,您似乎用 C++ 编写了一个插件,告诉 javascript 引擎做一些事情。这不太可能有效。 我想将 js 代码重写为 c++ 以使其更快地运行。我设法用数字轻松做到这一点,但现在用字符串我遇到了这个问题。我将尝试用纯 C++ 编写此函数并查看性能。我会在 w 分钟内发送它 我不知道怎么做,但是在纯 c++ 上这个函数需要更多时间。我改了常量,纯c++取了1.689s
,当c++ addon: 204.53ms
和js: 148.073ms
。
你是如何编译你的 C++ 代码的?这是比较函数时应该回答的第一个问题。
使用 node-gyp 然后只需要 js 文件中的本机代码
【参考方案1】:
首先,Javascript 解释器在它可以执行的优化类型方面非常先进(实际上在某些情况下将 Javascript 代码编译为本机代码),与大多数人的想法相比,这显着减少了 Javascript 和 C++ 之间的差异。
其次,跨越 C++/Javascript 边界会产生一些相关的开销成本,因为您在 Javascript 世界和 C++ 世界之间编组函数参数(创建副本、执行堆操作等)。因此,如果该开销相对于操作的执行而言是显着的,那么它可能会否定您首先使用 C++ 的优势。
对于更详细的 cmets,我们需要查看 f()
在 Javascript 和 C++ 中的实际实现。
【讨论】:
我删除了c++和js之间传递的所有数据,它减少了一点c++时间,但仍然比js长很多。从第一部分开始,即使优化很好,c++ 不应该至少与 js 几乎同时工作。用 c++ 编写的节点(据我所知)如何比 c++ 本身更快? @ALEX - 你没有向我们展示这里的大部分操作代码(f()
在两种语言中的实现)所以除了调用开销之外我们没有什么可以真正评论的。
这里,我把它上传到了 gitHub:github.com/TTPO100AJIEX/c-VSjs。正如我所说,这只是大量的字符串工作(甚至在 js 上有点不准确)以上是关于node.js 的 c++ 插件的速度的主要内容,如果未能解决你的问题,请参考以下文章