在Nodejs中创buildv8arrays的性能

我正在尝试将一个JSalgorithm移植到C ++中,以查看是否可以改进性能,但是在填充v8arrays时,我正面临着巨大的性能瓶颈。

这是一个片段,重现只是数组填充。 我创build了一个800k项目的数组,每个项目是17个数字的数组。 这个algorithm需要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 ++创buildJS对象(并与它们进行交互)比从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 * )的引用,并将其填充到工作线程中(请参阅nanAsyncWorker以获得方便的帮助)。

正如所说的,在C ++中使用JS数组是很昂贵的。 使用缓冲区可以工作,但是你也可以使用TypedArrays。 这些可以从C ++访问,作为指向连续的,alignment的内存块的指针,这使得它们易于使用并且快速迭代。

有关如何访问其内容的信息,请参阅https://stackoverflow.com/a/31712512/1218408