gpt4 book ai didi

c++ - 在 Nodejs 中创建 v8 数组的性能

转载 作者:行者123 更新时间:2023-11-30 05:30:08 27 4
gpt4 key购买 nike

我正在尝试将 JS 算法移植到 C++,以查看是否可以提高性能,但我在填充 v8 数组时遇到了巨大的性能瓶颈。

这是一个仅重现数组填充的片段。我创建了一个包含 800k 个项目的数组,每个项目都是一个包含 17 个数字的数组。这个算法在我的机器上执行需要 3 秒,这是相当大的。

有没有办法加快速度?

#include <node.h>

namespace demo {

using namespace v8; // just for lisibility of the example

void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Array> array = Array::New(isolate, 800000);

for (int i = 0; i < 800000; ++i) {
Local<Array> line = Array::New(isolate, 17);

for (int j = 0; j < 17; ++j) {
line->Set(j, Number::New(isolate, i * 100 + j));
}

array->Set(i, line);
}

args.GetReturnValue().Set(array);
}

void Init(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}

NODE_MODULE(parser, Init)

}

最佳答案

从 C++ 创建 JS 对象(并与它们交互)比从 JS 更昂贵。这可以轻松抵消其余 C++ 代码的性能提升。

您可以通过 Buffer 进行通信来解决此问题(序列化开销通常会低于上述开销)。更重要的是,这还可以让您脱离主 v8 线程完成工作。

如果您只处理数字,使用 Buffer.readIntLE 应该相对简单(或类似的方法)。您还可以将数组的长度编码到缓冲区的前几个字节中。以下是 JS 方面的内容:

var buf = new Buffer(/* Large enough to contain your serialized data. */);

// Function defined in your C++ addon.
addon.populate(buf, function (err) {
if (err) {
// Handle C++ error.
return;
}
// At this point, `buf` contains the serialized data. Deserialization
// will depend on the chosen serialization format but a reasonable
// option could be the following:
var arr = [];
var pos = 4;
var size = buf.readInt32LE(0);
while (size--) {
var subarr = new Array(17);
for (var i = 0; i < 17; i++) {
subarr[i] = buf.readInt32LE(pos);
pos += 4;
}
arr.push(subarr);
}
// `arr` now contains your decoded data.
});

代码的 C++ 部分将保留对 buf 数据的引用(char *)并将其填充到工作线程中(参见 nan AsyncWorker 作为一个方便的 helper )。

关于c++ - 在 Nodejs 中创建 v8 数组的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36126569/

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