繁体   English   中英

node.js 的 C++ 插件速度

[英]speed of c++ addons for node.js

我在 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++ 中处理字符串真的很慢?

首先,Javascript 解释器在它可以执行的优化类型(实际上在某些情况下将 Javascript 代码编译为本机代码)方面非常先进,与大多数人认为的相比,这显着减少了 Javascript 和 C++ 之间的差异。

其次,当您在 Javascript 世界和 C++ 世界之间编组函数参数(创建副本、执行堆操作等)时,跨越 C++/Javascript 边界会产生一些与之相关的开销成本。 因此,如果该开销相对于操作的执行而言是显着的,那么它可能会抵消您首先使用 C++ 的优势。

对于更详细的注释,我们需要查看f()在 Javascript 和 C++ 中的实际实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM