gpt4 book ai didi

c++ - Node : Why nodejs c++ addon is so slow?

转载 作者:搜寻专家 更新时间:2023-11-01 00:33:57 25 4
gpt4 key购买 nike

我正在尝试编写一个非常简单的 nodejs C++ 插件,并将其用法与通常的 nodejs 模块用法(在 CoffeeScript 上编写)进行比较。我编写了一个测试,它从插件创建一百万个 AddonClass 对象实例,从模块创建 CoffeeClass。源代码是:

插件.cpp

#define BUILDING_NODE_EXTENSION
#include <node.h>
#include "addon_class.hpp"
using namespace v8;
static void InitAll(Handle<Object> target) {
Addon::Init(target);
}
NODE_MODULE(addon, InitAll)

插件类.hpp

#ifndef _ADDON_CLASS_HPP_
#define _ADDON_CLASS_HPP_

#include <node.h>

class Addon : public node::ObjectWrap {
public:
static void Init(v8::Handle<v8::Object> target);
private:
Addon(int value) : value_(value) {};
~Addon() {};
static v8::Handle<v8::Value> New(const v8::Arguments& args);
int value_;
};

#endif

插件类.cpp

#define BUILDING_NODE_EXTENSION
#include <cstdio>
#include <node.h>
#include "addon_class.hpp"
using namespace v8;

Persistent<FunctionTemplate> tpl;

void Addon::Init(Handle<Object> target) {
Local<FunctionTemplate> t = FunctionTemplate::New(New);
tpl = Persistent<FunctionTemplate>::New(t);
tpl->SetClassName(String::NewSymbol("AddonClass"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
target->Set(String::NewSymbol("AddonClass"), tpl->GetFunction());
}

Handle<Value> Addon::New(const Arguments& args) {
HandleScope scope;
Addon* obj = new Addon(0);
if (args[0]->IsNumber()) {
obj->value_ = args[0]->NumberValue();
}
obj->Wrap(args.This());
return args.This();
}

咖啡类.咖啡

class CoffeeClass
value: undefined

constructor: (@value) ->
if !@value? then @value = 0

exports.CoffeeClass = CoffeeClass

基准.咖啡

CoffeeClass = (require './CoffeeClass.coffee').CoffeeClass
AddonClass = (require './build/Release/addon.node').AddonClass

N = 1e6

calculateDiff = (d1, d2) ->
h = parseInt d2.getHours()
h -= parseInt d1.getHours()
m = parseInt d2.getMinutes() + h * 60
m -= parseInt d1.getMinutes()
s = parseInt d2.getSeconds() + m * 60
s -= parseInt d1.getSeconds()
ms = parseInt d2.getMilliseconds() + s * 1000
ms -= parseInt d1.getMilliseconds()
return ms

testCreate = (LC) ->
d1 = new Date()
for i in [1..N]
l = new LC
d2 = new Date()
console.log LC.name, calculateDiff(d1, d2), "ms"

testCreate(CoffeeClass)
testCreate(AddonClass)

这个基准测试的结果对我来说非常非常奇怪:

CoffeeClass 34 ms
AddonClass 487 ms

所以,问题是:为什么这个简单的插件这么慢?而且,更重要的是,是否可以用它做点什么?

最佳答案

此处的测试用例非常小,以至于 V8 和插件之间的接口(interface)开销大于编译后的 c++ 的任何性能节省。

插件的一个很好的用途是不聊天,例如对输入参数执行复杂和优化的算法或与复杂的 c++ 数据结构交互。您希望最大限度地减少对插件的调用频率,并最大限度地提高每次调用时它执行的工作。您甚至可以考虑将许多单独的调用打包到一个数组中。

关于c++ - Node : Why nodejs c++ addon is so slow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12197292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com