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.53msjs: 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++ 插件的速度的主要内容,如果未能解决你的问题,请参考以下文章

Node.js log4j-like 日志系统

Node.js C++ 插件学习指南

ionic4+angular7+cordova开发入门

带你从零学Node.js

Node.js Buffer(缓冲区)

node.js 1